Piotr Caban : msvcp90: Implement more basic_ostream<wchar>::operator<< functions.
Alexandre Julliard
julliard at winehq.org
Mon Jul 9 14:56:36 CDT 2012
Module: wine
Branch: master
Commit: bdb36b4afca83d93296f8d4fbc100018f4625b04
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bdb36b4afca83d93296f8d4fbc100018f4625b04
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Jul 4 16:14:15 2012 +0200
msvcp90: Implement more basic_ostream<wchar>::operator<< functions.
---
dlls/msvcp90/ios.c | 125 +++++++++++++++++++++++++++++++++++++++++++--
dlls/msvcp90/msvcp90.spec | 8 ++--
2 files changed, 124 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c
index b90aac6..dfbd51d 100644
--- a/dlls/msvcp90/ios.c
+++ b/dlls/msvcp90/ios.c
@@ -5674,8 +5674,30 @@ basic_ostream_wchar* __thiscall basic_ostream_wchar_print_ldouble(basic_ostream_
DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_streambuf, 8)
basic_ostream_wchar* __thiscall basic_ostream_wchar_print_streambuf(basic_ostream_wchar *this, basic_streambuf_wchar *val)
{
- FIXME("(%p %p) stub\n", this, val);
- return NULL;
+ basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+ IOSB_iostate state = IOSTATE_badbit;
+ unsigned short c = '\n';
+
+ TRACE("(%p %p)\n", this, val);
+
+ if(basic_ostream_wchar_sentry_create(this)) {
+ for(c = basic_streambuf_wchar_sgetc(val); c!=WEOF;
+ c = basic_streambuf_wchar_snextc(val)) {
+ state = IOSTATE_goodbit;
+
+ if(basic_streambuf_wchar_sputc(base->strbuf, c) == WEOF) {
+ state = IOSTATE_badbit;
+ break;
+ }
+ }
+ }else {
+ state = IOSTATE_badbit;
+ }
+ basic_ostream_wchar_sentry_destroy(this);
+
+ ios_base_width_set(&base->base, 0);
+ basic_ios_wchar_setstate(base, state);
+ return this;
}
/* ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at PBX@Z */
@@ -5808,10 +5830,103 @@ basic_ostream_wchar* __cdecl basic_ostream_wchar_print_bstr(basic_ostream_wchar
state = IOSTATE_badbit;
}
- for(; pad!=0; pad--) {
- if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
+ if(state == IOSTATE_goodbit) {
+ for(; pad!=0; pad--) {
+ if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
+ state = IOSTATE_badbit;
+ break;
+ }
+ }
+ }
+
+ base->base.wide = 0;
+ }else {
+ state = IOSTATE_badbit;
+ }
+ basic_ostream_wchar_sentry_destroy(ostr);
+
+ basic_ios_wchar_setstate(base, state);
+ return ostr;
+}
+
+/* ??$?6_WU?$char_traits at _W@std@@@std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AAV10@_W at Z */
+/* ??$?6_WU?$char_traits at _W@std@@@std@@YAAEAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AEAV10@_W at Z */
+basic_ostream_wchar* __cdecl basic_ostream_wchar_print_ch(basic_ostream_wchar *ostr, wchar_t ch)
+{
+ basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
+ IOSB_iostate state = IOSTATE_goodbit;
+
+ TRACE("(%p %d)\n", ostr, ch);
+
+ if(basic_ostream_wchar_sentry_create(ostr)) {
+ streamsize pad = (base->base.wide>1 ? base->base.wide-1 : 0);
+
+ if((base->base.fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
+ for(; pad!=0; pad--) {
+ if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
+ state = IOSTATE_badbit;
+ break;
+ }
+ }
+ }
+
+ if(state == IOSTATE_goodbit) {
+ if(basic_streambuf_wchar_sputc(base->strbuf, ch) == WEOF)
state = IOSTATE_badbit;
- break;
+ }
+
+ if(state == IOSTATE_goodbit) {
+ for(; pad!=0; pad--) {
+ if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
+ state = IOSTATE_badbit;
+ break;
+ }
+ }
+ }
+
+ base->base.wide = 0;
+ }else {
+ state = IOSTATE_badbit;
+ }
+ basic_ostream_wchar_sentry_destroy(ostr);
+
+ basic_ios_wchar_setstate(base, state);
+ return ostr;
+}
+
+/* ??$?6_WU?$char_traits at _W@std@@@std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AAV10@PB_W at Z */
+/* ??$?6_WU?$char_traits at _W@std@@@std@@YAAEAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AEAV10@PEB_W at Z */
+basic_ostream_wchar* __cdecl basic_ostream_wchar_print_str(basic_ostream_wchar *ostr, const wchar_t *str)
+{
+ basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
+ IOSB_iostate state = IOSTATE_goodbit;
+
+ TRACE("(%p %s)\n", ostr, debugstr_w(str));
+
+ if(basic_ostream_wchar_sentry_create(ostr)) {
+ MSVCP_size_t len = wcslen(str);
+ streamsize pad = (base->base.wide>len ? base->base.wide-len : 0);
+
+ if((base->base.fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
+ for(; pad!=0; pad--) {
+ if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
+ state = IOSTATE_badbit;
+ break;
+ }
+ }
+ }
+
+ if(state == IOSTATE_goodbit) {
+ if(basic_streambuf_wchar_sputn(base->strbuf, str, len) != len)
+ state = IOSTATE_badbit;
+ }
+
+ if(state == IOSTATE_goodbit) {
+ for(; pad!=0; pad--) {
+ if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
+ state = IOSTATE_badbit;
+ break;
+ }
}
}
diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec
index a428abf..833bba8 100644
--- a/dlls/msvcp90/msvcp90.spec
+++ b/dlls/msvcp90/msvcp90.spec
@@ -80,10 +80,10 @@
@ cdecl -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@PEBD at Z(ptr str) basic_ostream_char_print_str
@ cdecl -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@PBE at Z(ptr ptr) basic_ostream_char_print_str
@ cdecl -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@PEBE at Z(ptr ptr) basic_ostream_char_print_str
-@ stub -arch=win32 ??$?6_WU?$char_traits at _W@std@@@std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AAV10@PB_W at Z
-@ stub -arch=win64 ??$?6_WU?$char_traits at _W@std@@@std@@YAAEAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AEAV10@PEB_W at Z
-@ stub -arch=win32 ??$?6_WU?$char_traits at _W@std@@@std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AAV10@_W at Z
-@ stub -arch=win64 ??$?6_WU?$char_traits at _W@std@@@std@@YAAEAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AEAV10@_W at Z
+@ cdecl -arch=win32 ??$?6_WU?$char_traits at _W@std@@@std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AAV10@PB_W at Z(ptr wstr) basic_ostream_wchar_print_str
+@ cdecl -arch=win64 ??$?6_WU?$char_traits at _W@std@@@std@@YAAEAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AEAV10@PEB_W at Z(ptr wstr) basic_ostream_wchar_print_str
+@ cdecl -arch=win32 ??$?6_WU?$char_traits at _W@std@@@std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AAV10@_W at Z(ptr long) basic_ostream_wchar_print_ch
+@ cdecl -arch=win64 ??$?6_WU?$char_traits at _W@std@@@std@@YAAEAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AEAV10@_W at Z(ptr long) basic_ostream_wchar_print_ch
@ cdecl -arch=win32 ??$?6_WU?$char_traits at _W@std@@V?$allocator at _W@1@@std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AAV10@ABV?$basic_string at _WU?$char_traits at _W@std@@V?$allocator at _W@2@@0@@Z(ptr ptr) basic_ostream_wchar_print_bstr
@ cdecl -arch=win64 ??$?6_WU?$char_traits at _W@std@@V?$allocator at _W@1@@std@@YAAEAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AEAV10@AEBV?$basic_string at _WU?$char_traits at _W@std@@V?$allocator at _W@2@@0@@Z(ptr ptr) basic_ostream_wchar_print_bstr
@ cdecl -arch=win32 ??$?8DU?$char_traits at D@std@@V?$allocator at D@1@@std@@YA_NABV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0 at 0@Z(ptr ptr) MSVCP_basic_string_char_equal
More information about the wine-cvs
mailing list