1// Backward-compat support -*- C++ -*-
2
3// Copyright (C) 2001, 2002, 2004, 2005, 2009, 2010
4// Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 3, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// Under Section 7 of GPL version 3, you are granted additional
18// permissions described in the GCC Runtime Library Exception, version
19// 3.1, as published by the Free Software Foundation.
20
21// You should have received a copy of the GNU General Public License and
22// a copy of the GCC Runtime Library Exception along with this program;
23// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24// <http://www.gnu.org/licenses/>.
25
26/*
27 * Copyright (c) 1998
28 * Silicon Graphics Computer Systems, Inc.
29 *
30 * Permission to use, copy, modify, distribute and sell this software
31 * and its documentation for any purpose is hereby granted without fee,
32 * provided that the above copyright notice appear in all copies and
33 * that both that copyright notice and this permission notice appear
34 * in supporting documentation.  Silicon Graphics makes no
35 * representations about the suitability of this software for any
36 * purpose.  It is provided "as is" without express or implied warranty.
37 */
38
39// WARNING: The classes defined in this header are DEPRECATED.  This
40// header is defined in section D.7.1 of the C++ standard, and it
41// MAY BE REMOVED in a future standard revision.  One should use the
42// header <sstream> instead.
43
44#ifndef _BACKWARD_STRSTREAM
45#define _BACKWARD_STRSTREAM
46
47#include "backward_warning.h"
48#include <iosfwd>
49#include <ios>
50#include <istream>
51#include <ostream>
52#include <string>
53
54_GLIBCXX_BEGIN_NAMESPACE(std)
55
56  // Class strstreambuf, a streambuf class that manages an array of char.
57  // Note that this class is not a template.
58  class strstreambuf : public basic_streambuf<char, char_traits<char> >
59  {
60  public:
61    // Types.
62    typedef char_traits<char>              _Traits;
63    typedef basic_streambuf<char, _Traits> _Base;
64
65  public:
66    // Constructor, destructor
67    explicit strstreambuf(streamsize __initial_capacity = 0);
68    strstreambuf(void* (*__alloc)(size_t), void (*__free)(void*));
69
70    strstreambuf(char* __get, streamsize __n, char* __put = 0) throw ();
71    strstreambuf(signed char* __get, streamsize __n, signed char* __put = 0) throw ();
72    strstreambuf(unsigned char* __get, streamsize __n, unsigned char* __put=0) throw ();
73
74    strstreambuf(const char* __get, streamsize __n) throw ();
75    strstreambuf(const signed char* __get, streamsize __n) throw ();
76    strstreambuf(const unsigned char* __get, streamsize __n) throw ();
77
78    virtual ~strstreambuf();
79
80  public:
81    void freeze(bool = true) throw ();
82    char* str() throw ();
83    _GLIBCXX_PURE int pcount() const throw ();
84
85  protected:
86    virtual int_type overflow(int_type __c  = _Traits::eof());
87    virtual int_type pbackfail(int_type __c = _Traits::eof());
88    virtual int_type underflow();
89    virtual _Base* setbuf(char* __buf, streamsize __n);
90    virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir,
91			     ios_base::openmode __mode
92			     = ios_base::in | ios_base::out);
93    virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode
94			     = ios_base::in | ios_base::out);
95
96  private:
97    strstreambuf&
98    operator=(const strstreambuf&);
99
100    strstreambuf(const strstreambuf&);
101
102    // Dynamic allocation, possibly using _M_alloc_fun and _M_free_fun.
103    char* _M_alloc(size_t);
104    void  _M_free(char*);
105
106    // Helper function used in constructors.
107    void _M_setup(char* __get, char* __put, streamsize __n) throw ();
108
109  private:
110    // Data members.
111    void* (*_M_alloc_fun)(size_t);
112    void  (*_M_free_fun)(void*);
113
114    bool _M_dynamic  : 1;
115    bool _M_frozen   : 1;
116    bool _M_constant : 1;
117  };
118
119  // Class istrstream, an istream that manages a strstreambuf.
120  class istrstream : public basic_istream<char>
121  {
122  public:
123    explicit istrstream(char*);
124    explicit istrstream(const char*);
125    istrstream(char* , streamsize);
126    istrstream(const char*, streamsize);
127    virtual ~istrstream();
128
129    _GLIBCXX_CONST strstreambuf* rdbuf() const throw ();
130    char* str() throw ();
131
132  private:
133    strstreambuf _M_buf;
134  };
135
136  // Class ostrstream
137  class ostrstream : public basic_ostream<char>
138  {
139  public:
140    ostrstream();
141    ostrstream(char*, int, ios_base::openmode = ios_base::out);
142    virtual ~ostrstream();
143
144    _GLIBCXX_CONST strstreambuf* rdbuf() const throw ();
145    void freeze(bool = true) throw();
146    char* str() throw ();
147    _GLIBCXX_PURE int pcount() const throw ();
148
149  private:
150    strstreambuf _M_buf;
151  };
152
153  // Class strstream
154  class strstream : public basic_iostream<char>
155  {
156  public:
157    typedef char                        char_type;
158    typedef char_traits<char>::int_type int_type;
159    typedef char_traits<char>::pos_type pos_type;
160    typedef char_traits<char>::off_type off_type;
161
162    strstream();
163    strstream(char*, int, ios_base::openmode = ios_base::in | ios_base::out);
164    virtual ~strstream();
165
166    _GLIBCXX_CONST strstreambuf* rdbuf() const throw ();
167    void freeze(bool = true) throw ();
168    _GLIBCXX_PURE int pcount() const throw ();
169    char* str() throw ();
170
171  private:
172    strstreambuf _M_buf;
173  };
174
175_GLIBCXX_END_NAMESPACE
176
177#endif
178