strstream.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
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) 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __n = 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{ 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __init((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{ 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __init((char*)__gnext, __n, (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{ 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __init((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{ 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __init((char*)__gnext, __n, (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{ 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __init((char*)__gnext, __n, nullptr); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10373d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(strstreambuf&& __rhs) 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : streambuf(__rhs), 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_(__rhs.__strmode_), 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_(__rhs.__alsize_), 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_(__rhs.__palloc_), 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(__rhs.__pfree_) 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __rhs.setg(nullptr, nullptr, nullptr); 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __rhs.setp(nullptr, nullptr); 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf& 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::operator=(strstreambuf&& __rhs) 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0) 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__pfree_) 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(eback()); 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant delete [] eback(); 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant streambuf::operator=(__rhs); 127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ = __rhs.__strmode_; 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __alsize_ = __rhs.__alsize_; 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __palloc_ = __rhs.__palloc_; 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_ = __rhs.__pfree_; 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __rhs.setg(nullptr, nullptr, nullptr); 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __rhs.setp(nullptr, nullptr); 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 13573d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::~strstreambuf() 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0) 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__pfree_) 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(eback()); 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant delete [] eback(); 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::swap(strstreambuf& __rhs) 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant streambuf::swap(__rhs); 152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant _STD::swap(__strmode_, __rhs.__strmode_); 153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant _STD::swap(__alsize_, __rhs.__alsize_); 154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant _STD::swap(__palloc_, __rhs.__palloc_); 155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant _STD::swap(__pfree_, __rhs.__pfree_); 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::freeze(bool __freezefl) 160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__strmode_ & __dynamic) 162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__freezefl) 164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ |= __frozen; 165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ &= ~__frozen; 167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar* 171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::str() 172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__strmode_ & __dynamic) 174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ |= __frozen; 175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return eback(); 176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint 179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pcount() const 180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return static_cast<int>(pptr() - pbase()); 182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type 185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::overflow(int_type __c) 186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__c == EOF) 188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type(0); 189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pptr() == epptr()) 190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if ((__strmode_ & __dynamic) == 0 || (__strmode_ & __frozen) != 0) 192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type(EOF); 193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant streamsize old_size = (epptr() ? epptr() : egptr()) - eback(); 194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant streamsize new_size = max<streamsize>(__alsize_, 2*old_size); 195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* buf = nullptr; 196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__palloc_) 197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant buf = static_cast<char*>(__palloc_(new_size)); 198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant buf = new char[new_size]; 200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (buf == nullptr) 201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type(EOF); 202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant memcpy(buf, eback(), old_size); 203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptrdiff_t ninp = gptr() - eback(); 204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptrdiff_t einp = egptr() - eback(); 205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptrdiff_t nout = pptr() - pbase(); 206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptrdiff_t eout = epptr() - pbase(); 207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__strmode_ & __allocated) 208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__pfree_) 210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __pfree_(eback()); 211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant delete [] eback(); 213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(buf, buf + ninp, buf + einp); 215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(buf + einp, buf + einp + eout); 216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(nout); 217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __strmode_ |= __allocated; 218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *pptr() = static_cast<char>(__c); 220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(1); 221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type((unsigned char)__c); 222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type 225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pbackfail(int_type __c) 226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (eback() == gptr()) 228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return EOF; 229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__c == EOF) 230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant gbump(-1); 232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type(0); 233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__strmode_ & __constant) 235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (gptr()[-1] == static_cast<char>(__c)) 237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant gbump(-1); 239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __c; 240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return EOF; 242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant gbump(-1); 244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *gptr() = static_cast<char>(__c); 245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __c; 246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type 249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::underflow() 250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (gptr() == egptr()) 252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (egptr() >= pptr()) 254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return EOF; 255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(eback(), gptr(), pptr()); 256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return int_type((unsigned char)*gptr()); 258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type 261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which) 262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type __p(-1); 264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool pos_in = __which & ios::in; 265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool pos_out = __which & ios::out; 266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool legal = false; 267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__way) 268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::beg: 270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::end: 271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in || pos_out) 272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = true; 273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::cur: 275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in != pos_out) 276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = true; 277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in && gptr() == nullptr) 280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = false; 281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out && pptr() == nullptr) 282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = false; 283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (legal) 284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type newoff; 286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* seekhigh = epptr() ? epptr() : egptr(); 287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__way) 288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::beg: 290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = 0; 291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::cur: 293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = (pos_in ? gptr() : pptr()) - eback(); 294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::end: 296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = seekhigh - eback(); 297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff += __off; 300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (0 <= newoff && newoff <= seekhigh - eback()) 301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* newpos = eback() + newoff; 303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in) 304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(eback(), newpos, max(newpos, egptr())); 305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out) 306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant // min(pbase, newpos), newpos, epptr() 308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __off = epptr() - newpos; 309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(min(pbase(), newpos), epptr()); 310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(static_cast<int>((epptr() - pbase()) - __off)); 311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __p = newoff; 313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return pos_type(__p); 316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type 319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekpos(pos_type __sp, ios_base::openmode __which) 320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type __p(-1); 322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool pos_in = __which & ios::in; 323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool pos_out = __which & ios::out; 324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in || pos_out) 325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr))) 327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type newoff = __sp; 329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* seekhigh = epptr() ? epptr() : egptr(); 330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (0 <= newoff && newoff <= seekhigh - eback()) 331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* newpos = eback() + newoff; 333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in) 334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(eback(), newpos, max(newpos, egptr())); 335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out) 336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant // min(pbase, newpos), newpos, epptr() 338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type temp = epptr() - newpos; 339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(min(pbase(), newpos), epptr()); 340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(static_cast<int>((epptr() - pbase()) - temp)); 341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __p = newoff; 343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return pos_type(__p); 347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantistrstream::~istrstream() 350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantostrstream::~ostrstream() 354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstream::~strstream() 358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD 362