/* * Copyright (c) 1999 * Silicon Graphics Computer Systems, Inc. * * Copyright (c) 1999 * Boris Fomitchev * * This material is provided "as is", with absolutely no warranty expressed * or implied. Any use is at your own risk. * * Permission to use or copy this software for any purpose is hereby granted * without fee, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef _STLP_INTERNAL_STRSTREAM #define _STLP_INTERNAL_STRSTREAM #ifndef _STLP_INTERNAL_STREAMBUF # include #endif #ifndef _STLP_INTERNAL_ISTREAM # include // Includes , , #endif #ifndef _STLP_INTERNAL_STRING_H # include #endif _STLP_BEGIN_NAMESPACE #ifndef _STLP_USE_NAMESPACES # define strstream _STLP_strstream # define ostrstream _STLP_ostrstream # define istrstream _STLP_istrstream # define strstreambuf _STLP_strstreambuf #endif //---------------------------------------------------------------------- // Class strstreambuf, a streambuf class that manages an array of char. // Note that this class is not a template. class _STLP_CLASS_DECLSPEC strstreambuf : public basic_streambuf > { public: // Types. typedef char_traits _Traits; typedef basic_streambuf > _Base; typedef void* (*__alloc_fn)(size_t); typedef void (*__free_fn)(void*); public: // Constructor, destructor explicit strstreambuf(streamsize _Initial_capacity = 0); strstreambuf(__alloc_fn, __free_fn); strstreambuf(char* __get, streamsize __n, char* __put = 0); strstreambuf(signed char* __get, streamsize __n, signed char* __put = 0); strstreambuf(unsigned char* __get, streamsize __n, unsigned char* __put=0); strstreambuf(const char* __get, streamsize __n); strstreambuf(const signed char* __get, streamsize __n); strstreambuf(const unsigned char* __get, streamsize __n); virtual ~strstreambuf(); public: // strstreambuf operations. void freeze(bool = true); char* str(); int pcount() const; protected: // Overridden virtual member functions. virtual int_type overflow(int_type __c = _Traits::eof()); virtual int_type pbackfail(int_type __c = _Traits::eof()); virtual int_type underflow(); virtual _Base* setbuf(char* __buf, streamsize __n); virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir, ios_base::openmode __mode = ios_base::in | ios_base::out); virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode = ios_base::in | ios_base::out); private: // Helper functions. // Dynamic allocation, possibly using _M_alloc_fun and _M_free_fun. char* _M_alloc(size_t); void _M_free(char*); // Helper function used in constructors. void _M_setup(char* __get, char* __put, streamsize __n); private: // Data members. __alloc_fn _M_alloc_fun; __free_fn _M_free_fun; bool _M_dynamic : 1; bool _M_frozen : 1; bool _M_constant : 1; }; //---------------------------------------------------------------------- // Class istrstream, an istream that manages a strstreambuf. class _STLP_CLASS_DECLSPEC istrstream : public basic_istream > { public: explicit istrstream(char*); explicit istrstream(const char*); istrstream(char* , streamsize); istrstream(const char*, streamsize); virtual ~istrstream(); strstreambuf* rdbuf() const; char* str(); private: strstreambuf _M_buf; }; //---------------------------------------------------------------------- // Class ostrstream class _STLP_CLASS_DECLSPEC ostrstream : public basic_ostream > { public: ostrstream(); ostrstream(char*, int, ios_base::openmode = ios_base::out); virtual ~ostrstream(); strstreambuf* rdbuf() const; void freeze(bool = true); char* str(); int pcount() const; private: strstreambuf _M_buf; }; //---------------------------------------------------------------------- // Class strstream class _STLP_CLASS_DECLSPEC strstream : public basic_iostream > { public: typedef char char_type; typedef char_traits::int_type int_type; typedef char_traits::pos_type pos_type; typedef char_traits::off_type off_type; strstream(); strstream(char*, int, ios_base::openmode = ios_base::in | ios_base::out); virtual ~strstream(); strstreambuf* rdbuf() const; void freeze(bool = true); int pcount() const; char* str(); private: strstreambuf _M_buf; //explicitely defined as private to avoid warnings: strstream(strstream const&); strstream& operator = (strstream const&); }; _STLP_END_NAMESPACE #endif /* _STLP_INTERNAL_STRSTREAM */