18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* This is part of libio/iostream, providing -*- C++ -*- input/output.
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddCopyright (C) 2000 Free Software Foundation
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddThis file is part of the GNU IO Library.  This library is free
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsoftware; you can redistribute it and/or modify it under the
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddterms of the GNU General Public License as published by the
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddFree Software Foundation; either version 2, or (at your option)
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddany later version.
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddThis library is distributed in the hope that it will be useful,
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbut WITHOUT ANY WARRANTY; without even the implied warranty of
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddGNU General Public License for more details.
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddYou should have received a copy of the GNU General Public License
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddalong with this library; see the file COPYING.  If not, write to the Free
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddAs a special exception, if you link this library with files
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcompiled with a GNU compiler to produce an executable, this does not cause
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddthe resulting executable to be covered by the GNU General Public License.
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddThis exception does not however invalidate any other reasons why
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddthe executable file might be covered by the GNU General Public License. */
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* Written by Magnus Fromreide (magfr@lysator.liu.se). */
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* seekoff and ideas for overflow is largely borrowed from libstdc++-v3 */
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef __SSTREAM__
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define __SSTREAM__
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream.h>
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <streambuf.h>
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace std
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  class stringbuf : public streambuf
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  {
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  public:
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef char	char_type;
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef int		int_type;
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef streampos	pos_type;
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef streamoff	off_type;
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    explicit
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf(int which=ios::in|ios::out)
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      : streambuf(), mode(static_cast<ios::open_mode>(which)),
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	stream(NULL), stream_len(0)
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      stringbuf_init();
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    explicit
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf(const string &str, int which=ios::in|ios::out)
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      : streambuf(), mode(static_cast<ios::open_mode>(which)),
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	stream(NULL), stream_len(0)
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      if (mode & (ios::in|ios::out))
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  stream_len = str.size();
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  stream = new char_type[stream_len];
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  str.copy(stream, stream_len);
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      stringbuf_init();
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    virtual
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    ~stringbuf()
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      delete[] stream;
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    string
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    str() const
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      if (pbase() != 0)
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return string(stream, pptr()-pbase());
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      else
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return string();
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    void
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    str(const string& str)
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      delete[] stream;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      stream_len = str.size();
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      stream = new char_type[stream_len];
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      str.copy(stream, stream_len);
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      stringbuf_init();
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  protected:
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    // The buffer is already in gptr, so if it ends then it is out of data.
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    virtual int
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    underflow()
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return EOF;
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    virtual int
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    overflow(int c = EOF)
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      int res;
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      if (mode & ios::out)
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  if (c != EOF)
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    {
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      streamsize old_stream_len = stream_len;
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      stream_len += 1;
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      char_type* new_stream = new char_type[stream_len];
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      memcpy(new_stream, stream, old_stream_len);
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      delete[] stream;
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      stream = new_stream;
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      stringbuf_sync(gptr()-eback(), pptr()-pbase());
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      sputc(c);
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      res = c;
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    }
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  else
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    res = EOF;
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      else
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	res = 0;
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return res;
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    virtual streambuf*
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    setbuf(char_type* s, streamsize n)
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      if (n != 0)
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  delete[] stream;
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  stream = new char_type[n];
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  memcpy(stream, s, n);
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  stream_len = n;
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  stringbuf_sync(0, 0);
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return this;
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    virtual pos_type
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    seekoff(off_type off, ios::seek_dir way, int which = ios::in | ios::out)
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      pos_type ret =  pos_type(off_type(-1));
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      bool testin = which & ios::in && mode & ios::in;
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      bool testout = which & ios::out && mode & ios::out;
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      bool testboth = testin && testout && way != ios::cur;
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      if (stream_len && ((testin != testout) || testboth))
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  char_type* beg = stream;
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  char_type* curi = NULL;
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  char_type* curo = NULL;
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  char_type* endi = NULL;
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  char_type* endo = NULL;
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  if (testin)
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    {
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      curi = gptr();
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      endi = egptr();
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    }
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  if (testout)
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    {
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      curo = pptr();
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      endo = epptr();
1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    }
1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  off_type newoffi = 0;
1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  off_type newoffo = 0;
1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  if (way == ios::beg)
1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    {
1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      newoffi = beg - curi;
1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      newoffo = beg - curo;
1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    }
1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  else if (way == ios::end)
1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    {
1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      newoffi = endi - curi;
1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      newoffo = endo - curo;
1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    }
1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  if (testin && newoffi + off + curi - beg >= 0 &&
1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      endi - beg >= newoffi + off + curi - beg)
1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    {
1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      gbump(newoffi + off);
1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      ret = pos_type(newoffi + off + curi);
1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    }
1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  if (testout && newoffo + off + curo - beg >= 0 &&
1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      endo - beg >= newoffo + off + curo - beg)
1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    {
1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      pbump(newoffo + off);
1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	      ret = pos_type(newoffo + off + curo);
1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    }
1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return ret;
1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    virtual pos_type
1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    seekpos(pos_type sp, int which = ios::in | ios::out)
1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      pos_type ret = seekoff(sp, ios::beg, which);
2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return ret;
2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  private:
2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    void
2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf_sync(streamsize i, streamsize o)
2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      if (mode & ios::in)
2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	setg(stream, stream + i, stream + stream_len);
2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      if (mode & ios::out)
2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{
2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  setp(stream, stream + stream_len);
2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  pbump(o);
2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    void
2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf_init()
2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      if (mode & ios::ate)
2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	stringbuf_sync(0, stream_len);
2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      else
2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	stringbuf_sync(0, 0);
2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  private:
2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    ios::open_mode	mode;
2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    char_type*		stream;
2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    streamsize		stream_len;
2288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  };
2298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  class istringstream : public istream {
2318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  public:
2328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef char	char_type;
2338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef int		int_type;
2348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef streampos	pos_type;
2358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef streamoff	off_type;
2368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    explicit
2388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    istringstream(int which=ios::in)
2398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      : istream(&sb), sb(which | ios::in)
2408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    { }
2418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    explicit
2438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    istringstream(const string& str, int which=ios::in)
2448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      : istream(&sb), sb(str, which | ios::in)
2458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    { }
2468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf*
2488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    rdbuf() const
2498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
2508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return const_cast<stringbuf*>(&sb);
2518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
2528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    string
2548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    str() const
2558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
2568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return rdbuf()->str();
2578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
2588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    void
2598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    str(const string& s)
2608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
2618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      rdbuf()->str(s);
2628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
2638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  private:
2648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf sb;
2658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  };
2668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  class ostringstream : public ostream {
2688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  public:
2698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef char	char_type;
2708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef int		int_type;
2718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef streampos	pos_type;
2728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef streamoff	off_type;
2738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    explicit
2758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    ostringstream(int which=ios::out)
2768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      : ostream(&sb), sb(which | ios::out)
2778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    { }
2788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    explicit
2808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    ostringstream(const string& str, int which=ios::out)
2818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      : ostream(&sb), sb(str, which | ios::out)
2828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    { }
2838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf*
2858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    rdbuf() const
2868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
2878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return const_cast<stringbuf*>(&sb);
2888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
2898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    string
2918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    str() const
2928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
2938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return rdbuf()->str();
2948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
2958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    void str(const string& s)
2978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
2988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      rdbuf()->str(s);
2998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
3008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  private:
3018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf sb;
3028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  };
3038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  class stringstream : public iostream {
3058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  public:
3068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef char	char_type;
3078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef int		int_type;
3088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef streampos	pos_type;
3098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    typedef streamoff	off_type;
3108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    explicit
3128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringstream(int which=ios::out|ios::in)
3138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      : iostream(&sb), sb(which)
3148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    { }
3158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    explicit
3178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringstream(const string& str, int which=ios::out|ios::in)
3188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      : iostream(&sb), sb(str, which)
3198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    { }
3208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf*
3228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    rdbuf() const
3238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
3248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return const_cast<stringbuf*>(&sb);
3258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
3268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    string
3288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    str() const
3298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
3308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      return rdbuf()->str();
3318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
3328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    void
3348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    str(const string& s)
3358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    {
3368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      rdbuf()->str(s);
3378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    }
3388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  private:
3398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    stringbuf sb;
3408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  };
3418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
3428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* not __STRSTREAM__ */
344