Piotr Caban : msvcp90: Implement more basic_ostream<char>::operator<< functions.

Alexandre Julliard julliard at winehq.org
Mon Jul 9 14:56:36 CDT 2012


Module: wine
Branch: master
Commit: ce4cbc7de22f1facac433b78486e136ddbe37463
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ce4cbc7de22f1facac433b78486e136ddbe37463

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Jul  4 16:14:02 2012 +0200

msvcp90: Implement more basic_ostream<char>::operator<< functions.

---

 dlls/msvcp90/ios.c        |  133 +++++++++++++++++++++++++++++++++++++++++++--
 dlls/msvcp90/msvcp90.spec |   24 ++++----
 2 files changed, 140 insertions(+), 17 deletions(-)

diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c
index 74321f5..b90aac6 100644
--- a/dlls/msvcp90/ios.c
+++ b/dlls/msvcp90/ios.c
@@ -4924,8 +4924,30 @@ basic_ostream_char* __thiscall basic_ostream_char_print_ldouble(basic_ostream_ch
 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_streambuf, 8)
 basic_ostream_char* __thiscall basic_ostream_char_print_streambuf(basic_ostream_char *this, basic_streambuf_char *val)
 {
-    FIXME("(%p %p) stub\n", this, val);
-    return NULL;
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_badbit;
+    int c = '\n';
+
+    TRACE("(%p %p)\n", this, val);
+
+    if(basic_ostream_char_sentry_create(this)) {
+        for(c = basic_streambuf_char_sgetc(val); c!=EOF;
+                c = basic_streambuf_char_snextc(val)) {
+            state = IOSTATE_goodbit;
+
+            if(basic_streambuf_char_sputc(base->strbuf, c) == EOF) {
+                state = IOSTATE_badbit;
+                break;
+            }
+        }
+    }else {
+        state = IOSTATE_badbit;
+    }
+    basic_ostream_char_sentry_destroy(this);
+
+    ios_base_width_set(&base->base, 0);
+    basic_ios_char_setstate(base, state);
+    return this;
 }
 
 /* ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at PBX@Z */
@@ -5058,10 +5080,111 @@ basic_ostream_char* __cdecl basic_ostream_char_print_bstr(basic_ostream_char *os
                     state = IOSTATE_badbit;
         }
 
-        for(; pad!=0; pad--) {
-            if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) {
+        if(state == IOSTATE_goodbit) {
+            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;
+}
+
+/* ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@C at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@C at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@D at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@D at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@E at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@E at Z */
+basic_ostream_char* __cdecl basic_ostream_char_print_ch(basic_ostream_char *ostr, char ch)
+{
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
+    IOSB_iostate state = IOSTATE_goodbit;
+
+    TRACE("(%p %d)\n", ostr, ch);
+
+    if(basic_ostream_char_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_char_sputc(base->strbuf, base->fillch) == EOF) {
+                    state = IOSTATE_badbit;
+                    break;
+                }
+            }
+        }
+
+        if(state == IOSTATE_goodbit) {
+            if(basic_streambuf_char_sputc(base->strbuf, ch) == EOF)
                 state = IOSTATE_badbit;
-                break;
+        }
+
+        if(state == IOSTATE_goodbit) {
+            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;
+}
+
+/* ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@PBC at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@PEBC at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@PBD at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@PEBD at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@PBE at Z */
+/* ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@PEBE at Z */
+basic_ostream_char* __cdecl basic_ostream_char_print_str(basic_ostream_char *ostr, const char *str)
+{
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
+    IOSB_iostate state = IOSTATE_goodbit;
+
+    TRACE("(%p %s)\n", ostr, str);
+
+    if(basic_ostream_char_sentry_create(ostr)) {
+        MSVCP_size_t len = strlen(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, str, len) != len)
+                state = IOSTATE_badbit;
+        }
+
+        if(state == IOSTATE_goodbit) {
+            for(; pad!=0; pad--) {
+                if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) {
+                    state = IOSTATE_badbit;
+                    break;
+                }
             }
         }
 
diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec
index 23552a2..a428abf 100644
--- a/dlls/msvcp90/msvcp90.spec
+++ b/dlls/msvcp90/msvcp90.spec
@@ -68,18 +68,18 @@
 @ stub -arch=win64 ??$?6OGU?$char_traits at G@std@@@std@@YAAEAV?$basic_ostream at GU?$char_traits at G@std@@@0 at AEAV10@AEBV?$complex at O@0@@Z
 @ stub -arch=win32 ??$?6O_WU?$char_traits at _W@std@@@std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AAV10@ABV?$complex at O@0@@Z
 @ stub -arch=win64 ??$?6O_WU?$char_traits at _W@std@@@std@@YAAEAV?$basic_ostream at _WU?$char_traits at _W@std@@@0 at AEAV10@AEBV?$complex at O@0@@Z
-@ stub -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@C at Z
-@ stub -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@C at Z
-@ stub -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@D at Z
-@ stub -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@D at Z
-@ stub -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@E at Z
-@ stub -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@E at Z
-@ stub -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@PBC at Z
-@ stub -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@PEBC at Z
-@ stub -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@PBD at Z
-@ stub -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
-@ stub -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
-@ stub -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
+@ cdecl -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@C at Z(ptr long) basic_ostream_char_print_ch
+@ cdecl -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@C at Z(ptr long) basic_ostream_char_print_ch
+@ cdecl -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@D at Z(ptr long) basic_ostream_char_print_ch
+@ cdecl -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@D at Z(ptr long) basic_ostream_char_print_ch
+@ cdecl -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@E at Z(ptr long) basic_ostream_char_print_ch
+@ cdecl -arch=win64 ??$?6U?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@E at Z(ptr long) basic_ostream_char_print_ch
+@ cdecl -arch=win32 ??$?6U?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@PBC 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@PEBC at Z(ptr ptr) 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@PBD at Z(ptr str) 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@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




More information about the wine-cvs mailing list