You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
6.7 KiB
253 lines
6.7 KiB
// strstream standard header
|
|
#pragma once
|
|
#ifndef _STRSTREAM_
|
|
#define _STRSTREAM_
|
|
#include <istream>
|
|
|
|
#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 */
|