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