Daniel Lehman : msvcp: Sync std::getline(istream<> &) implementations.

Alexandre Julliard julliard at winehq.org
Mon Nov 5 13:32:23 CST 2012


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

Author: Daniel Lehman <dlehman at esri.com>
Date:   Fri Nov  2 11:27:12 2012 -0700

msvcp: Sync std::getline(istream<> &) implementations.

---

 dlls/msvcp60/ios.c |   40 ++++++++++++++++++++--------------------
 dlls/msvcp71/ios.c |   40 ++++++++++++++++++++--------------------
 2 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/dlls/msvcp60/ios.c b/dlls/msvcp60/ios.c
index bd3eb7d..946afa5 100644
--- a/dlls/msvcp60/ios.c
+++ b/dlls/msvcp60/ios.c
@@ -7767,27 +7767,27 @@ basic_istream_char* __thiscall basic_istream_char_read_bool(basic_istream_char *
 basic_istream_char* __cdecl basic_istream_char_getline_bstr_delim(
         basic_istream_char *istream, basic_string_char *str, char delim)
 {
-    IOSB_iostate state = IOSTATE_failbit;
+    basic_ios_char *base = basic_istream_char_get_basic_ios(istream);
+    IOSB_iostate state = IOSTATE_goodbit;
     int c = (unsigned char)delim;
 
     TRACE("(%p %p %c)\n", istream, str, delim);
 
     if(basic_istream_char_sentry_create(istream, TRUE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
         basic_string_char_clear(str);
 
-        c = basic_istream_char_get(istream);
-        if(c != EOF)
-            state = IOSTATE_goodbit;
-
-        for(; c!=(unsigned char)delim && c!=EOF; c = basic_istream_char_get(istream)) {
-            state = IOSTATE_goodbit;
+        c = basic_streambuf_char_sgetc(strbuf);
+        for(; c!=(unsigned char)delim && c!=EOF; c = basic_streambuf_char_snextc(strbuf))
             basic_string_char_append_ch(str, c);
-        }
+        if(c==EOF) state |= IOSTATE_eofbit;
+        else if(c==(unsigned char)delim) basic_streambuf_char_sbumpc(strbuf);
+
+        if(!basic_string_char_length(str) && c!=(unsigned char)delim) state |= IOSTATE_failbit;
     }
     basic_istream_char_sentry_destroy(istream);
 
-    basic_ios_char_setstate(basic_istream_char_get_basic_ios(istream),
-        state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    basic_ios_char_setstate(basic_istream_char_get_basic_ios(istream), state);
     return istream;
 }
 
@@ -9078,27 +9078,27 @@ basic_istream_wchar* __thiscall basic_istream_short_read_bool(basic_istream_wcha
 basic_istream_wchar* __cdecl basic_istream_wchar_getline_bstr_delim(
         basic_istream_wchar *istream, basic_string_wchar *str, wchar_t delim)
 {
-    IOSB_iostate state = IOSTATE_failbit;
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istream);
+    IOSB_iostate state = IOSTATE_goodbit;
     int c = delim;
 
     TRACE("(%p %p %c)\n", istream, str, delim);
 
     if(basic_istream_wchar_sentry_create(istream, TRUE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
         basic_string_wchar_clear(str);
 
-        c = basic_istream_wchar_get(istream);
-        if(c != WEOF)
-            state = IOSTATE_goodbit;
-
-        for(; c!=delim && c!=WEOF; c = basic_istream_wchar_get(istream)) {
-            state = IOSTATE_goodbit;
+        c = basic_streambuf_wchar_sgetc(strbuf);
+        for(; c!=delim && c!=WEOF; c = basic_streambuf_wchar_snextc(strbuf))
             basic_string_wchar_append_ch(str, c);
-        }
+        if(c==delim) basic_streambuf_wchar_sbumpc(strbuf);
+        else if(c==WEOF) state |= IOSTATE_eofbit;
+
+        if(!basic_string_wchar_length(str) && c!=delim) state |= IOSTATE_failbit;
     }
     basic_istream_wchar_sentry_destroy(istream);
 
-    basic_ios_wchar_setstate(basic_istream_wchar_get_basic_ios(istream),
-            state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    basic_ios_wchar_setstate(basic_istream_wchar_get_basic_ios(istream), state);
     return istream;
 }
 
diff --git a/dlls/msvcp71/ios.c b/dlls/msvcp71/ios.c
index fff2abc..95037e9 100644
--- a/dlls/msvcp71/ios.c
+++ b/dlls/msvcp71/ios.c
@@ -8108,27 +8108,27 @@ basic_istream_char* __thiscall basic_istream_char_read_bool(basic_istream_char *
 basic_istream_char* __cdecl basic_istream_char_getline_bstr_delim(
         basic_istream_char *istream, basic_string_char *str, char delim)
 {
-    IOSB_iostate state = IOSTATE_failbit;
+    basic_ios_char *base = basic_istream_char_get_basic_ios(istream);
+    IOSB_iostate state = IOSTATE_goodbit;
     int c = (unsigned char)delim;
 
     TRACE("(%p %p %c)\n", istream, str, delim);
 
     if(basic_istream_char_sentry_create(istream, TRUE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
         MSVCP_basic_string_char_clear(str);
 
-        c = basic_istream_char_get(istream);
-        if(c != EOF)
-            state = IOSTATE_goodbit;
-
-        for(; c!=(unsigned char)delim && c!=EOF; c = basic_istream_char_get(istream)) {
-            state = IOSTATE_goodbit;
+        c = basic_streambuf_char_sgetc(strbuf);
+        for(; c!=(unsigned char)delim && c!=EOF; c = basic_streambuf_char_snextc(strbuf))
             MSVCP_basic_string_char_append_ch(str, c);
-        }
+        if(c==EOF) state |= IOSTATE_eofbit;
+        else if(c==(unsigned char)delim) basic_streambuf_char_sbumpc(strbuf);
+
+        if(!MSVCP_basic_string_char_length(str) && c!=(unsigned char)delim) state |= IOSTATE_failbit;
     }
     basic_istream_char_sentry_destroy(istream);
 
-    basic_ios_char_setstate(basic_istream_char_get_basic_ios(istream),
-        state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    basic_ios_char_setstate(basic_istream_char_get_basic_ios(istream), state);
     return istream;
 }
 
@@ -9573,27 +9573,27 @@ basic_istream_wchar* __thiscall basic_istream_short_read_bool(basic_istream_wcha
 basic_istream_wchar* __cdecl basic_istream_wchar_getline_bstr_delim(
         basic_istream_wchar *istream, basic_string_wchar *str, wchar_t delim)
 {
-    IOSB_iostate state = IOSTATE_failbit;
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istream);
+    IOSB_iostate state = IOSTATE_goodbit;
     int c = delim;
 
     TRACE("(%p %p %c)\n", istream, str, delim);
 
     if(basic_istream_wchar_sentry_create(istream, TRUE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
         MSVCP_basic_string_wchar_clear(str);
 
-        c = basic_istream_wchar_get(istream);
-        if(c != WEOF)
-            state = IOSTATE_goodbit;
-
-        for(; c!=delim && c!=WEOF; c = basic_istream_wchar_get(istream)) {
-            state = IOSTATE_goodbit;
+        c = basic_streambuf_wchar_sgetc(strbuf);
+        for(; c!=delim && c!=WEOF; c = basic_streambuf_wchar_snextc(strbuf))
             MSVCP_basic_string_wchar_append_ch(str, c);
-        }
+        if(c==delim) basic_streambuf_wchar_sbumpc(strbuf);
+        else if(c==WEOF) state |= IOSTATE_eofbit;
+
+        if(!MSVCP_basic_string_wchar_length(str) && c!=delim) state |= IOSTATE_failbit;
     }
     basic_istream_wchar_sentry_destroy(istream);
 
-    basic_ios_wchar_setstate(basic_istream_wchar_get_basic_ios(istream),
-            state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    basic_ios_wchar_setstate(basic_istream_wchar_get_basic_ios(istream), state);
     return istream;
 }
 




More information about the wine-cvs mailing list