Piotr Caban : msvcp90: Added operator<<(basic_ostream<char>, basic_string< char>) implementation.
Alexandre Julliard
julliard at winehq.org
Fri Jun 15 13:34:39 CDT 2012
Module: wine
Branch: master
Commit: e43f6ec6385fdefa87138c2881a29e593a101b32
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e43f6ec6385fdefa87138c2881a29e593a101b32
Author: Piotr Caban <piotr at 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 at D@std@@V?$allocator at D@1@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@ABV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0@@Z */
+/* ??$?6DU?$char_traits at D@std@@V?$allocator at D@1@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@AEBV?$basic_string at DU?$char_traits at D@std@@V?$allocator at 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 at _W@std@@@std@@YAAEAV?$basic_istream at _WU?$char_traits at _W@std@@@0 at AEAV10@PEA_W at Z
@ stub -arch=win32 ??$?5_WU?$char_traits at _W@std@@V?$allocator at _W@1@@std@@YAAAV?$basic_istream at _WU?$char_traits at _W@std@@@0 at AAV10@AAV?$basic_string at _WU?$char_traits at _W@std@@V?$allocator at _W@2@@0@@Z
@ stub -arch=win64 ??$?5_WU?$char_traits at _W@std@@V?$allocator at _W@1@@std@@YAAEAV?$basic_istream at _WU?$char_traits at _W@std@@@0 at AEAV10@AEAV?$basic_string at _WU?$char_traits at _W@std@@V?$allocator at _W@2@@0@@Z
-@ stub -arch=win32 ??$?6DU?$char_traits at D@std@@V?$allocator at D@1@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@ABV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0@@Z
-@ stub -arch=win64 ??$?6DU?$char_traits at D@std@@V?$allocator at D@1@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@AEBV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0@@Z
+@ cdecl -arch=win32 ??$?6DU?$char_traits at D@std@@V?$allocator at D@1@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@ABV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0@@Z(ptr ptr) basic_ostream_char_print_bstr
+@ cdecl -arch=win64 ??$?6DU?$char_traits at D@std@@V?$allocator at D@1@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@AEBV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0@@Z(ptr ptr) basic_ostream_char_print_bstr
@ stub -arch=win32 ??$?6GU?$char_traits at G@std@@@std@@YAAAV?$basic_ostream at GU?$char_traits at G@std@@@0 at AAV10@G at Z
@ stub -arch=win64 ??$?6GU?$char_traits at G@std@@@std@@YAAEAV?$basic_ostream at GU?$char_traits at G@std@@@0 at AEAV10@G at Z
@ stub -arch=win32 ??$?6GU?$char_traits at G@std@@@std@@YAAAV?$basic_ostream at GU?$char_traits at G@std@@@0 at AAV10@PBG at 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 at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIXZ */
/* ?length@?$basic_string at DU?$char_traits at D@std@@V?$allocator at 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;
More information about the wine-cvs
mailing list