strstream.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===------------------------ strstream.cpp -------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// This file is distributed under the University of Illinois Open Source 6bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// License. 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 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifdef _LIBCPP_MOVE 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 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif 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 Hinnant 261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type 262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which) 263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type __p(-1); 265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool pos_in = __which & ios::in; 266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool pos_out = __which & ios::out; 267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool legal = false; 268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__way) 269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::beg: 271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::end: 272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in || pos_out) 273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = true; 274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::cur: 276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in != pos_out) 277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = true; 278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in && gptr() == nullptr) 281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = false; 282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out && pptr() == nullptr) 283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant legal = false; 284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (legal) 285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type newoff; 287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* seekhigh = epptr() ? epptr() : egptr(); 288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__way) 289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::beg: 291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = 0; 292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::cur: 294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = (pos_in ? gptr() : pptr()) - eback(); 295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case ios::end: 297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff = seekhigh - eback(); 298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant newoff += __off; 301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (0 <= newoff && newoff <= seekhigh - eback()) 302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* newpos = eback() + newoff; 304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in) 305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(eback(), newpos, max(newpos, egptr())); 306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out) 307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant // min(pbase, newpos), newpos, epptr() 309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __off = epptr() - newpos; 310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(min(pbase(), newpos), epptr()); 311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(static_cast<int>((epptr() - pbase()) - __off)); 312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __p = newoff; 314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return pos_type(__p); 317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type 321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekpos(pos_type __sp, ios_base::openmode __which) 322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type __p(-1); 324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool pos_in = __which & ios::in; 325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool pos_out = __which & ios::out; 326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in || pos_out) 327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr))) 329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type newoff = __sp; 331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* seekhigh = epptr() ? epptr() : egptr(); 332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (0 <= newoff && newoff <= seekhigh - eback()) 333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* newpos = eback() + newoff; 335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_in) 336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setg(eback(), newpos, max(newpos, egptr())); 337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (pos_out) 338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant // min(pbase, newpos), newpos, epptr() 340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant off_type temp = epptr() - newpos; 341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant setp(min(pbase(), newpos), epptr()); 342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pbump(static_cast<int>((epptr() - pbase()) - temp)); 343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __p = newoff; 345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return pos_type(__p); 349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantistrstream::~istrstream() 352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantostrstream::~ostrstream() 356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstream::~strstream() 360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD 364