137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh/*
237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copyright (c) 1999
337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Silicon Graphics Computer Systems, Inc.
437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh *
537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copyright (c) 1999
637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Boris Fomitchev
737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh *
837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This material is provided "as is", with absolutely no warranty expressed
937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * or implied. Any use is at your own risk.
1037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh *
1137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Permission to use or copy this software for any purpose is hereby granted
1237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * without fee, provided the above notices are retained on all copies.
1337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Permission to modify the code and to distribute modified code is granted,
1437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * provided the above notices are retained, and a notice that the code was
1537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * modified is included with the above copyright notice.
1637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh *
1737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */
1837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _STLP_INTERNAL_STRSTREAM
1937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#define _STLP_INTERNAL_STRSTREAM
2037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
2137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _STLP_INTERNAL_STREAMBUF
2237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#  include <stl/_streambuf.h>
2337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
2437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
2537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _STLP_INTERNAL_ISTREAM
2637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#  include <stl/_istream.h>              // Includes <ostream>, <ios>, <iosfwd>
2737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
2837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
2937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _STLP_INTERNAL_STRING_H
3037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#  include <stl/_string.h>
3137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
3237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
3337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_STLP_BEGIN_NAMESPACE
3437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
3537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _STLP_USE_NAMESPACES
3637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#  define strstream _STLP_strstream
3737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#  define ostrstream _STLP_ostrstream
3837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#  define istrstream _STLP_istrstream
3937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#  define strstreambuf _STLP_strstreambuf
4037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
4137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
4237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh//----------------------------------------------------------------------
4337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Class strstreambuf, a streambuf class that manages an array of char.
4437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Note that this class is not a template.
4537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
4637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehclass _STLP_CLASS_DECLSPEC strstreambuf : public basic_streambuf<char, char_traits<char> > {
4737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehpublic:                         // Types.
4837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef char_traits<char>              _Traits;
4937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef basic_streambuf<char, char_traits<char> > _Base;
5037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef void* (*__alloc_fn)(size_t);
5137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef void (*__free_fn)(void*);
5237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehpublic:                         // Constructor, destructor
5337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
5437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  explicit strstreambuf(streamsize _Initial_capacity = 0);
5537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
5637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf(__alloc_fn, __free_fn);
5737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
5837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf(char* __get, streamsize __n, char* __put = 0);
5937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf(signed char* __get, streamsize __n, signed char* __put = 0);
6037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf(unsigned char* __get, streamsize __n, unsigned char* __put=0);
6137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
6237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf(const char* __get, streamsize __n);
6337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf(const signed char* __get, streamsize __n);
6437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf(const unsigned char* __get, streamsize __n);
6537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
6637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual ~strstreambuf();
6737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
6837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehpublic:                         // strstreambuf operations.
6937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  void freeze(bool = true);
7037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  char* str();
7137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  int pcount() const;
7237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
7337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehprotected:                      // Overridden virtual member functions.
7437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual int_type overflow(int_type __c  = _Traits::eof());
7537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual int_type pbackfail(int_type __c = _Traits::eof());
7637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual int_type underflow();
7737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual _Base* setbuf(char* __buf, streamsize __n);
7837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir,
7937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh                           ios_base::openmode __mode
8037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh                                      = ios_base::in | ios_base::out);
8137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode
8237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh                                      = ios_base::in | ios_base::out);
8337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
8437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehprivate:                        // Helper functions.
8537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  // Dynamic allocation, possibly using _M_alloc_fun and _M_free_fun.
8637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  char* _M_alloc(size_t);
8737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  void  _M_free(char*);
8837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
8937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  // Helper function used in constructors.
9037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  void _M_setup(char* __get, char* __put, streamsize __n);
9137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehprivate:                        // Data members.
9237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  __alloc_fn _M_alloc_fun;
9337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  __free_fn  _M_free_fun;
9437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  bool _M_dynamic  : 1;
9537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  bool _M_frozen   : 1;
9637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  bool _M_constant : 1;
9737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh};
9837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
9937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh//----------------------------------------------------------------------
10037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Class istrstream, an istream that manages a strstreambuf.
10137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
10237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehclass _STLP_CLASS_DECLSPEC istrstream : public basic_istream<char, char_traits<char> > {
10337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehpublic:
10437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  explicit istrstream(char*);
10537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  explicit istrstream(const char*);
10637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  istrstream(char* , streamsize);
10737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  istrstream(const char*, streamsize);
10837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual ~istrstream();
10937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
11037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf* rdbuf() const;
11137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  char* str();
11237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
11337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehprivate:
11437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf _M_buf;
11537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh};
11637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
11737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh//----------------------------------------------------------------------
11837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Class ostrstream
11937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
12037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehclass _STLP_CLASS_DECLSPEC ostrstream : public basic_ostream<char, char_traits<char> >
12137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh{
12237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehpublic:
12337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  ostrstream();
12437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  ostrstream(char*, int, ios_base::openmode = ios_base::out);
12537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual ~ostrstream();
12637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
12737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf* rdbuf() const;
12837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  void freeze(bool = true);
12937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  char* str();
13037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  int pcount() const;
13137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
13237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehprivate:
13337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf _M_buf;
13437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh};
13537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
13637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh//----------------------------------------------------------------------
13737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Class strstream
13837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
13937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehclass _STLP_CLASS_DECLSPEC strstream : public basic_iostream<char, char_traits<char> > {
14037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehpublic:
14137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef char                        char_type;
14237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef char_traits<char>::int_type int_type;
14337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef char_traits<char>::pos_type pos_type;
14437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef char_traits<char>::off_type off_type;
14537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
14637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstream();
14737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstream(char*, int, ios_base::openmode = ios_base::in | ios_base::out);
14837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  virtual ~strstream();
14937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
15037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf* rdbuf() const;
15137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  void freeze(bool = true);
15237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  int pcount() const;
15337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  char* str();
15437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
15537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehprivate:
15637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstreambuf _M_buf;
15737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
15837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  //explicitely defined as private to avoid warnings:
15937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstream(strstream const&);
16037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  strstream& operator = (strstream const&);
16137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh};
16237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
16337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_STLP_END_NAMESPACE
16437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
16537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif /* _STLP_INTERNAL_STRSTREAM */
166