stdcxx-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From far...@apache.org
Subject svn commit: r640831 - /stdcxx/trunk/include/sstream.cc
Date Tue, 25 Mar 2008 14:33:05 GMT
Author: faridz
Date: Tue Mar 25 07:33:02 2008
New Revision: 640831

URL: http://svn.apache.org/viewvc?rev=640831&view=rev
Log:
2008-03-25  Farid Zaripov  <farid_zaripov@epam.com>

	STDCXX-792
	* include/sstream.cc (str): Save pptr and restore is at the end if
	str() is called with internal buffer to increase the capacity of
	buffer (i.e. from xsputn() or overflow()).
	(xsputn): Remove fix for STDCXX-515 because the pptr now is
	preserved in str().

Modified:
    stdcxx/trunk/include/sstream.cc

Modified: stdcxx/trunk/include/sstream.cc
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/sstream.cc?rev=640831&r1=640830&r2=640831&view=diff
==============================================================================
--- stdcxx/trunk/include/sstream.cc (original)
+++ stdcxx/trunk/include/sstream.cc Tue Mar 25 07:33:02 2008
@@ -82,8 +82,10 @@
     _ValueAlloc __alloc;
 
     // new buffer and size
-    char_type     *__buf;
-    _RWSTD_SIZE_T  __bufsize = __slen;
+    char_type        *__buf;
+    _RWSTD_SIZE_T     __bufsize = __slen;
+    // saved offset of pptr 
+    _RWSTD_STREAMSIZE __off = -1;
 
     if (__s == this->_C_buffer) {
         // special case: str(_C_buffer, _C_bufsize + N) called
@@ -94,6 +96,8 @@
         // set `slen' to the number of initialized characters
         // in the buffer
         __slen = this->egptr () - this->pbase ();
+        // save the offset of pptr
+        __off = this->pptr () - this->pbase ();
     }
 
     if (this->_C_bufsize < __bufsize) {
@@ -166,8 +170,12 @@
     if (this->_C_is_out ()) {
         this->setp (this->_C_buffer, this->_C_buffer + this->_C_bufsize);
 
-        if (   __s != __buf && this->_C_state & ios_base::in
-            || this->_C_state & (ios_base::app | ios_base::ate)) {
+        if (0 <= __off) {
+            // restore the pptr
+            this->pbump (__off);
+        }
+        else if (   this->_C_state & ios_base::in
+                 || this->_C_state & (ios_base::app | ios_base::ate)) {
             // in input or append/ate modes seek to end
             // (see also lwg issue 562 for clarification)
             this->pbump (__slen);
@@ -204,15 +212,9 @@
             __off = this->pbase () - __s;
         }
 
-        // preserve current pptr() since str() would seek to end
-        const streamsize __cur = this->pptr () - this->pbase ();
-
         // grow the buffer if necessary to accommodate the whole
         // string plus the contents of the buffer up to pptr()
         str (this->_C_buffer, __bufsize);
-
-        // restore pptr()
-        this->pbump (__cur - (this->pptr () - this->pbase ()));
 
         _RWSTD_ASSERT (__n <= this->epptr () - this->pptr ());
 



Mime
View raw message