Module: wine Branch: master Commit: e43f6ec6385fdefa87138c2881a29e593a101b32 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e43f6ec6385fdefa87138c2881...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Jun 15 11:07:23 2012 +0200
msvcp90: Added operator<<(basic_ostream<char>, basic_string<char>) implementation.
---
dlls/msvcp90/ios.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ dlls/msvcp90/msvcp90.h | 1 + dlls/msvcp90/msvcp90.spec | 4 ++-- dlls/msvcp90/string.c | 2 +- 4 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c index 9cb3a59..4fd7640 100644 --- a/dlls/msvcp90/ios.c +++ b/dlls/msvcp90/ios.c @@ -3940,6 +3940,50 @@ basic_ostream_char* __cdecl basic_ostream_char_endl(basic_ostream_char *ostr) return ostr; }
+/* $?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z */ +/* ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z */ +basic_ostream_char* __cdecl basic_ostream_char_print_bstr(basic_ostream_char *ostr, const basic_string_char *str) +{ + basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr); + IOSB_iostate state = IOSTATE_goodbit; + + TRACE("(%p %p)\n", ostr, str); + + if(basic_ostream_char_sentry_create(ostr)) { + MSVCP_size_t len = MSVCP_basic_string_char_length(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_char_sputc(base->strbuf, base->fillch) == EOF) { + state = IOSTATE_badbit; + break; + } + } + } + + if(state == IOSTATE_goodbit) { + if(basic_streambuf_char_sputn(base->strbuf, MSVCP_basic_string_char_c_str(str), len) != len) + state = IOSTATE_badbit; + } + + for(; pad!=0; pad--) { + if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) { + state = IOSTATE_badbit; + break; + } + } + + base->base.wide = 0; + }else { + state = IOSTATE_badbit; + } + basic_ostream_char_sentry_destroy(ostr); + + basic_ios_char_setstate(base, state); + return ostr; +} + /* Caution: basic_istream uses virtual inheritance. */ static inline basic_ios_char* basic_istream_char_get_basic_ios(basic_istream_char *this) { diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h index 4523845..a7091ee 100644 --- a/dlls/msvcp90/msvcp90.h +++ b/dlls/msvcp90/msvcp90.h @@ -258,6 +258,7 @@ void __stdcall MSVCP_basic_string_char_dtor(basic_string_char*); const char* __stdcall MSVCP_basic_string_char_c_str(const basic_string_char*); void __thiscall MSVCP_basic_string_char_clear(basic_string_char*); basic_string_char* __thiscall MSVCP_basic_string_char_append_ch(basic_string_char*, char); +MSVCP_size_t __thiscall MSVCP_basic_string_char_length(const basic_string_char*);
#define BUF_SIZE_WCHAR 8 typedef struct _basic_string_wchar diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index 5c2477a..5290c68 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -42,8 +42,8 @@ @ stub -arch=win64 ??$?5_WU?$char_traits@_W@std@@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AEAV10@PEA_W@Z @ stub -arch=win32 ??$?5_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AAV10@AAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z @ stub -arch=win64 ??$?5_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AEAV10@AEAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z -@ stub -arch=win32 ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z -@ stub -arch=win64 ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z +@ cdecl -arch=win32 ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z(ptr ptr) basic_ostream_char_print_bstr +@ cdecl -arch=win64 ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z(ptr ptr) basic_ostream_char_print_bstr @ stub -arch=win32 ??$?6GU?$char_traits@G@std@@@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@0@AAV10@G@Z @ stub -arch=win64 ??$?6GU?$char_traits@G@std@@@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@0@AEAV10@G@Z @ stub -arch=win32 ??$?6GU?$char_traits@G@std@@@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@0@AAV10@PBG@Z diff --git a/dlls/msvcp90/string.c b/dlls/msvcp90/string.c index e404699..bb42944 100644 --- a/dlls/msvcp90/string.c +++ b/dlls/msvcp90/string.c @@ -1077,7 +1077,7 @@ void __thiscall MSVCP_basic_string_char_dtor(basic_string_char *this) /* ?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */ /* ?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_length, 4) -MSVCP_size_t __thiscall MSVCP_basic_string_char_length(basic_string_char *this) +MSVCP_size_t __thiscall MSVCP_basic_string_char_length(const basic_string_char *this) { TRACE("%p\n", this); return this->size;