// strstream standard header #pragma once #ifndef _STRSTREAM_ #define _STRSTREAM_ #include #pragma pack(push,8) #pragma warning(push,3) _STD_BEGIN // CLASS strstreambuf class strstreambuf : public streambuf { // stream buffer associated with static or allocated character array public: enum { // constants for bits in stream state _Allocated = 1, // set if character array storage has been allocated _Constant = 2, // set if character array nonmutable _Dynamic = 4, // set if character array length grows on demand _Frozen = 8}; // set if character array ownership given away typedef int _Strstate; explicit strstreambuf(streamsize _Count = 0) { // construct with empty character array, suggested initial size _Init(_Count); } strstreambuf(void *(__cdecl *_Allocfunc)(size_t), void (__cdecl *_Freefunc)(void *)) { // construct with empty character array, allocation functions _Init(); _Palloc = _Allocfunc; _Pfree = _Freefunc; } strstreambuf(char *_Getptr, streamsize _Count, char *_Putptr = 0) { // construct with [_Getptr, _Getptr + _Count), possibly mutable _Init(_Count, _Getptr, _Putptr); } strstreambuf(unsigned char *_Getptr, streamsize _Count, unsigned char *_Putptr = 0) { // construct with [_Getptr, _Getptr + _Count), possibly mutable _Init(_Count, (char *)_Getptr, (char *)_Putptr); } strstreambuf(const char *_Getptr, streamsize _Count) { // construct with [_Getptr, _Getptr + _Count), nonmutable _Init(_Count, (char *)_Getptr, 0, _Constant); } strstreambuf(const unsigned char *_Getptr, streamsize _Count) { // construct with [_Getptr, _Getptr + _Count), nonmutable _Init(_Count, (char *)_Getptr, 0, _Constant); } _CRTIMP2 virtual ~strstreambuf(); // destroy the object _CRTIMP2 void freeze(bool = true); // freeze or unfreeze writing char *str() { // freeze and return pointer to character array freeze(); return (gptr()); } streamsize pcount() const { // return size of writable character array return (pptr() == 0 ? 0 : (streamsize)(pptr() - pbase())); } strstreambuf(signed char *_Getptr, streamsize _Count, signed char *_Putptr = 0) { // construct with [_Getptr, _Getptr + _Count), possibly mutable _Init(_Count, (char *)_Getptr, (char *)_Putptr); } strstreambuf(const signed char *_Getptr, streamsize _Count) { // construct with [_Getptr, _Getptr + _Count), nonmutable _Init(_Count, (char *)_Getptr, 0, _Constant); } protected: _CRTIMP2 virtual int overflow(int = EOF); // try to extend write area _CRTIMP2 virtual int pbackfail(int = EOF); // try to putback a character _CRTIMP2 virtual int underflow(); // read if read position available _CRTIMP2 virtual streampos seekoff(streamoff, ios_base::seekdir, ios_base::openmode = ios_base::in | ios_base::out); // seek by specified offset _CRTIMP2 virtual streampos seekpos(streampos, ios_base::openmode = ios_base::in | ios_base::out); // seek to memorized position _CRTIMP2 void _Init(streamsize = 0, char * = 0, char * = 0, _Strstate = (_Strstate)0); // initialize with possibly static buffer _CRTIMP2 void _Tidy(); // free any allocated storage private: enum { // constant for default minimum buffer size _MINSIZE = 32}; streamsize _Minsize; // the minimum buffer size char *_Pendsave; // the saved end pointer during freeze char *_Seekhigh; // the high-water pointer in character array _Strstate _Strmode; // the stream state void *(__cdecl *_Palloc)(size_t); // the pointer to allocator function void (__cdecl *_Pfree)(void *); // the pointer to free function }; // CLASS istrstream class istrstream : public istream { // input stream associated with a character array public: explicit istrstream(const char *_Ptr) : istream(&_Mysb), _Mysb(_Ptr, 0) { // construct with NTBS } istrstream(const char *_Ptr, streamsize _Count) : istream(&_Mysb), _Mysb(_Ptr, _Count) { // construct with [_Ptr, _Ptr + _Count) } explicit istrstream(char *_Ptr) : istream(&_Mysb), _Mysb((const char *)_Ptr, 0) { // construct with NTBS } istrstream(char *_Ptr, int _Count) : istream(&_Mysb), _Mysb((const char *)_Ptr, _Count) { // construct with [_Ptr, _Ptr + _Count) } _CRTIMP2 virtual ~istrstream(); // destroy the object strstreambuf *rdbuf() const { // return pointer to character array buffer return ((strstreambuf *)&_Mysb); } char *str() { // freeze and return pointer to character array return (_Mysb.str()); } private: strstreambuf _Mysb; // the string buffer }; // CLASS ostrstream class ostrstream : public ostream { // output stream associated with a character array public: ostrstream() : ostream(&_Mysb), _Mysb() { // construct with empty character array } _CRTIMP2 ostrstream(char *, streamsize, ios_base::openmode = ios_base::out); // construct with static array _CRTIMP2 virtual ~ostrstream(); // destroy the object strstreambuf *rdbuf() const { // return pointer to character array buffer return ((strstreambuf *)&_Mysb); } void freeze(bool _Freezeit = true) { // freeze or unfreeze writing _Mysb.freeze(_Freezeit); } char *str() { // freeze and return pointer to character array return (_Mysb.str()); } streamsize pcount() const { // return size of writable character array return (_Mysb.pcount()); } private: strstreambuf _Mysb; // the character array buffer }; // CLASS strstream class strstream : public iostream { // input/output stream associated with character array buffer public: typedef char char_type; typedef int int_type; typedef streampos pos_type; typedef streamoff off_type; strstream() : iostream(&_Mysb), _Mysb() { // construct with empty character array } _CRTIMP2 strstream(char *, streamsize, ios_base::openmode = ios_base::in | ios_base::out); // construct with static array _CRTIMP2 virtual ~strstream(); // destroy the object strstreambuf *rdbuf() const { // return pointer to character array buffer return ((strstreambuf *)&_Mysb); } void freeze(bool _Freezeit = true) { // freeze or unfreeze writing _Mysb.freeze(_Freezeit); } char *str() { // freeze and return pointer to character array return (_Mysb.str()); } streamsize pcount() const { // return size of writable character array return (_Mysb.pcount()); } private: strstreambuf _Mysb; // the character array buffer }; _STD_END #pragma warning(pop) #pragma pack(pop) #endif /* _STRSTREAM_ */ /* * Copyright (c) 1992-2001 by P.J. Plauger. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. V3.10:0009 */