1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===------------------------ strstream.cpp -------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "strstream" 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "algorithm" 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "climits" 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "cstring" 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(streamsize __alsize) 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __strmode_(__dynamic), 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__alsize), 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(nullptr), 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(nullptr) 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*)) 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __strmode_(__dynamic), 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__default_alsize), 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(__palloc), 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(__pfree) 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::__init(char* __gnext, streamsize __n, char* __pbeg) 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__n == 0) 37ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant __n = static_cast<streamsize>(strlen(__gnext)); 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else if (__n < 0) 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __n = INT_MAX; 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__pbeg == nullptr) 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(__gnext, __gnext, __gnext + __n); 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(__gnext, __gnext, __pbeg); 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(__pbeg, __pbeg + __n); 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(char* __gnext, streamsize __n, char* __pbeg) 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __strmode_(), 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__default_alsize), 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(nullptr), 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(nullptr) 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __init(__gnext, __n, __pbeg); 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(const char* __gnext, streamsize __n) 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __strmode_(__constant), 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__default_alsize), 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(nullptr), 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(nullptr) 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 644c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger __init(const_cast<char *>(__gnext), __n, nullptr); 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg) 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __strmode_(), 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__default_alsize), 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(nullptr), 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(nullptr) 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 734c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, reinterpret_cast<char*>(__pbeg)); 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(const signed char* __gnext, streamsize __n) 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __strmode_(__constant), 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__default_alsize), 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(nullptr), 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(nullptr) 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 824c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, nullptr); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg) 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __strmode_(), 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__default_alsize), 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(nullptr), 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(nullptr) 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 914c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, reinterpret_cast<char*>(__pbeg)); 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(const unsigned char* __gnext, streamsize __n) 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __strmode_(__constant), 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__default_alsize), 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(nullptr), 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(nullptr) 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 1004c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, nullptr); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::~strstreambuf() 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0) 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__pfree_) 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(eback()); 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant delete [] eback(); 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::swap(strstreambuf& __rhs) 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant streambuf::swap(__rhs); 1180949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant _VSTD::swap(__strmode_, __rhs.__strmode_); 1190949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant _VSTD::swap(__alsize_, __rhs.__alsize_); 1200949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant _VSTD::swap(__palloc_, __rhs.__palloc_); 1210949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant _VSTD::swap(__pfree_, __rhs.__pfree_); 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::freeze(bool __freezefl) 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__strmode_ & __dynamic) 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__freezefl) 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ |= __frozen; 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ &= ~__frozen; 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar* 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::str() 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__strmode_ & __dynamic) 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ |= __frozen; 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return eback(); 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pcount() const 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return static_cast<int>(pptr() - pbase()); 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type 151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::overflow(int_type __c) 152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__c == EOF) 154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type(0); 155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pptr() == epptr()) 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if ((__strmode_ & __dynamic) == 0 || (__strmode_ & __frozen) != 0) 158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type(EOF); 1593e005bf6b2649da693d6c3109b5947890a0ffec3Marshall Clow size_t old_size = static_cast<size_t> ((epptr() ? epptr() : egptr()) - eback()); 1603e005bf6b2649da693d6c3109b5947890a0ffec3Marshall Clow size_t new_size = max<size_t>(static_cast<size_t>(__alsize_), 2*old_size); 161b74309e3ad06106480d94f93eca0fa491743ae87Howard Hinnant if (new_size == 0) 162b74309e3ad06106480d94f93eca0fa491743ae87Howard Hinnant new_size = __default_alsize; 163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* buf = nullptr; 164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__palloc_) 1653e005bf6b2649da693d6c3109b5947890a0ffec3Marshall Clow buf = static_cast<char*>(__palloc_(new_size)); 166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant buf = new char[new_size]; 168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (buf == nullptr) 169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type(EOF); 170ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant memcpy(buf, eback(), static_cast<size_t>(old_size)); 171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptrdiff_t ninp = gptr() - eback(); 172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptrdiff_t einp = egptr() - eback(); 173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptrdiff_t nout = pptr() - pbase(); 174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptrdiff_t eout = epptr() - pbase(); 175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__strmode_ & __allocated) 176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__pfree_) 178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(eback()); 179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant delete [] eback(); 181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(buf, buf + ninp, buf + einp); 183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(buf + einp, buf + einp + eout); 184ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant pbump(static_cast<int>(nout)); 185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ |= __allocated; 186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *pptr() = static_cast<char>(__c); 188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(1); 1894c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger return int_type(static_cast<unsigned char>(__c)); 190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type 193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pbackfail(int_type __c) 194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (eback() == gptr()) 196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return EOF; 197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__c == EOF) 198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant gbump(-1); 200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type(0); 201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__strmode_ & __constant) 203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (gptr()[-1] == static_cast<char>(__c)) 205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant gbump(-1); 207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __c; 208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return EOF; 210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant gbump(-1); 212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *gptr() = static_cast<char>(__c); 213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __c; 214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type 217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::underflow() 218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (gptr() == egptr()) 220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (egptr() >= pptr()) 222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return EOF; 223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(eback(), gptr(), pptr()); 224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 2254c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger return int_type(static_cast<unsigned char>(*gptr())); 226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type 229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which) 230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type __p(-1); 2329de3d4cab3ac91362e2a30406cd005cdc581eec5Marshall Clow bool pos_in = (__which & ios::in) != 0; 2339de3d4cab3ac91362e2a30406cd005cdc581eec5Marshall Clow bool pos_out = (__which & ios::out) != 0; 234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool legal = false; 235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__way) 236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::beg: 238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::end: 239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in || pos_out) 240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = true; 241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::cur: 243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in != pos_out) 244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = true; 245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in && gptr() == nullptr) 248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = false; 249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out && pptr() == nullptr) 250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = false; 251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (legal) 252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type newoff; 254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* seekhigh = epptr() ? epptr() : egptr(); 255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__way) 256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::beg: 258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = 0; 259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::cur: 261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = (pos_in ? gptr() : pptr()) - eback(); 262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::end: 264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = seekhigh - eback(); 265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff += __off; 268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (0 <= newoff && newoff <= seekhigh - eback()) 269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* newpos = eback() + newoff; 271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in) 2720949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant setg(eback(), newpos, _VSTD::max(newpos, egptr())); 273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out) 274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant // min(pbase, newpos), newpos, epptr() 276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __off = epptr() - newpos; 277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(min(pbase(), newpos), epptr()); 278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(static_cast<int>((epptr() - pbase()) - __off)); 279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __p = newoff; 281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return pos_type(__p); 284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type 287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekpos(pos_type __sp, ios_base::openmode __which) 288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type __p(-1); 2909de3d4cab3ac91362e2a30406cd005cdc581eec5Marshall Clow bool pos_in = (__which & ios::in) != 0; 2919de3d4cab3ac91362e2a30406cd005cdc581eec5Marshall Clow bool pos_out = (__which & ios::out) != 0; 292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in || pos_out) 293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr))) 295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type newoff = __sp; 297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* seekhigh = epptr() ? epptr() : egptr(); 298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (0 <= newoff && newoff <= seekhigh - eback()) 299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* newpos = eback() + newoff; 301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in) 3020949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant setg(eback(), newpos, _VSTD::max(newpos, egptr())); 303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out) 304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant // min(pbase, newpos), newpos, epptr() 306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type temp = epptr() - newpos; 307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(min(pbase(), newpos), epptr()); 308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(static_cast<int>((epptr() - pbase()) - temp)); 309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __p = newoff; 311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return pos_type(__p); 315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantistrstream::~istrstream() 318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantostrstream::~ostrstream() 322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstream::~strstream() 326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD 330