// strstream definitions -*- C++ -*-

// Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
// USA.

// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

/*
 * Copyright (c) 1998
 * Silicon Graphics Computer Systems, Inc.
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Silicon Graphics makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 */

// Implementation of the classes in header <strstream>.
// WARNING: The classes defined in <strstream> are DEPRECATED.  This
// header is defined in section D.7.1 of the C++ standard, and it
// MAY BE REMOVED in a future standard revision.  You should use the
// header <sstream> instead.

#include <strstream>
#include <algorithm>
#include <new>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

_GLIBCXX_BEGIN_NAMESPACE(std)

  strstreambuf::strstreambuf(streamsize initial_capacity)
  : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(true), 
    _M_frozen(false), _M_constant(false)
  {
    streamsize n = std::max(initial_capacity, streamsize(16));
    
    char* buf = _M_alloc(n);
    if (buf) 
      {
	setp(buf, buf + n);
	setg(buf, buf, buf);
      }
  }

  strstreambuf::strstreambuf(void* (*alloc_f)(size_t), void (*free_f)(void*))
  : _Base(), _M_alloc_fun(alloc_f), _M_free_fun(free_f), _M_dynamic(true), 
    _M_frozen(false), _M_constant(false)
  {
    streamsize n = 16;

    char* buf = _M_alloc(n);
    if (buf) 
      {
	setp(buf, buf + n);
	setg(buf, buf, buf);
      }
  }

  strstreambuf::strstreambuf(char* get, streamsize n, char* put)
  : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(false), 
    _M_frozen(false), _M_constant(false)
  { _M_setup(get, put, n); }

  strstreambuf::strstreambuf(signed char* get, streamsize n, signed char* put)
  : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(false), 
  _M_frozen(false), _M_constant(false)
  { _M_setup(reinterpret_cast<char*>(get), reinterpret_cast<char*>(put), n); }

  strstreambuf::strstreambuf(unsigned char* get, streamsize n, 
			     unsigned char* put)
  : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(false), 
    _M_frozen(false), _M_constant(false)
  { _M_setup(reinterpret_cast<char*>(get), reinterpret_cast<char*>(put), n); }

  strstreambuf::strstreambuf(const char* get, streamsize n)
  : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(false), 
    _M_frozen(false), _M_constant(true)
  { _M_setup(const_cast<char*>(get), 0, n); }

  strstreambuf::strstreambuf(const signed char* get, streamsize n)
  : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(false), 
    _M_frozen(false), _M_constant(true)
  { _M_setup(reinterpret_cast<char*>(const_cast<signed char*>(get)), 0, n); }

  strstreambuf::strstreambuf(const unsigned char* get, streamsize n)
  : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(false), 
    _M_frozen(false), _M_constant(true)
  { _M_setup(reinterpret_cast<char*>(const_cast<unsigned char*>(get)), 0, n); }

  strstreambuf::~strstreambuf()
  {
    if (_M_dynamic && !_M_frozen)
      _M_free(eback());
  }

  void 
  strstreambuf::freeze(bool frozenflag)
  {
    if (_M_dynamic)
      _M_frozen = frozenflag;
  }

  char* 
  strstreambuf::str()
  {
    freeze(true);
    return eback();
  }

  int 
  strstreambuf::pcount() const
  { return pptr() ? pptr() - pbase() : 0; }

  strstreambuf::int_type 
  strstreambuf::overflow(int_type c) 
  {
    if (c == traits_type::eof())
      return traits_type::not_eof(c);
    
    // Try to expand the buffer.
    if (pptr() == epptr() && _M_dynamic && !_M_frozen && !_M_constant) 
      {
	ptrdiff_t old_size = epptr() - pbase();
	ptrdiff_t new_size = std::max(ptrdiff_t(2 * old_size), ptrdiff_t(1));
	
	char* buf = _M_alloc(new_size);
	if (buf) 
	  {
	    memcpy(buf, pbase(), old_size);
	    char* old_buffer = pbase();
	    bool reposition_get = false;
	    ptrdiff_t old_get_offset;
	    if (gptr() != 0) 
	      {
		reposition_get = true;
		old_get_offset = gptr() - eback();
	      }
	    
	    setp(buf, buf + new_size);
	    pbump(old_size);

	    if (reposition_get)
	      setg(buf, buf + old_get_offset, buf + 
		   std::max(old_get_offset, old_size));

	    _M_free(old_buffer);
	  }
      }
    
    if (pptr() != epptr()) 
      {
	*pptr() = c;
	pbump(1);
	return c;
      }
    else
      return traits_type::eof();
  }

  strstreambuf::int_type 
  strstreambuf::pbackfail(int_type c)
  {
    if (gptr() != eback()) 
      {
      if (c == _Traits::eof()) 
	{
	  gbump(-1);
	  return _Traits::not_eof(c);
	}
      else if (c == _Traits::to_int_type(gptr()[-1])) 
	{  // KLUDGE
	  gbump(-1);
	  return c;
	}
      else if (!_M_constant) 
	{
	  gbump(-1);
	  *gptr() = c;
	  return c;
	}
    }
    return _Traits::eof();
  }

  strstreambuf::int_type 
  strstreambuf::underflow()
  {
    if (gptr() == egptr() && pptr() && pptr() > egptr())
      setg(eback(), gptr(), pptr());
    
    if (gptr() != egptr())
      return (unsigned char) *gptr();
    else
      return _Traits::eof();
  }

  basic_streambuf<char, char_traits<char> >*
  strstreambuf::setbuf(char*, streamsize)
  { return this; }

  strstreambuf::pos_type
  strstreambuf::seekoff(off_type off, ios_base::seekdir dir, 
			ios_base::openmode mode)
  {
    bool do_get = false;
    bool do_put = false;

    if ((mode & (ios_base::in | ios_base::out)) 
	== (ios_base::in | ios_base::out) &&
	(dir == ios_base::beg || dir == ios_base::end))
      do_get = do_put = true;
    else if (mode & ios_base::in)
      do_get = true;
    else if (mode & ios_base::out)
      do_put = true;

    // !gptr() is here because, according to D.7.1 paragraph 4, the seekable
    // area is undefined if there is no get area.
    if ((!do_get && !do_put) || (do_put && !pptr()) || !gptr())
      return pos_type(off_type(-1));

    char* seeklow  = eback();
    char* seekhigh = epptr() ? epptr() : egptr();

    off_type newoff;
    switch (dir) 
      {
      case ios_base::beg:
	newoff = 0;
	break;
      case ios_base::end:
	newoff = seekhigh - seeklow;
	break;
      case ios_base::cur:
	newoff = do_put ? pptr() - seeklow : gptr() - seeklow;
	break;
      default:
	return pos_type(off_type(-1));
      }
    
    off += newoff;
    if (off < 0 || off > seekhigh - seeklow)
      return pos_type(off_type(-1));

    if (do_put) 
      {
	if (seeklow + off < pbase()) 
	  {
	    setp(seeklow, epptr());
	    pbump(off);
	  }
	else 
	  {
	    setp(pbase(), epptr());
	    pbump(off - (pbase() - seeklow));
	  }
      }
    if (do_get) 
      {
	if (off <= egptr() - seeklow)
	  setg(seeklow, seeklow + off, egptr());
	else if (off <= pptr() - seeklow)
	  setg(seeklow, seeklow + off, pptr());
	else
	  setg(seeklow, seeklow + off, epptr());
      }
    return pos_type(newoff);
  }

  strstreambuf::pos_type
  strstreambuf::seekpos(pos_type pos, ios_base::openmode mode)
  { return seekoff(pos - pos_type(off_type(0)), ios_base::beg, mode); }

  char* 
  strstreambuf::_M_alloc(size_t n)
  {
    if (_M_alloc_fun)
      return static_cast<char*>(_M_alloc_fun(n));
    else
      return new char[n];
  }

  void 
  strstreambuf::_M_free(char* p)
  {
    if (p)
      if (_M_free_fun)
	_M_free_fun(p);
      else
	delete[] p;
  }

  void 
  strstreambuf::_M_setup(char* get, char* put, streamsize n)
  {
    if (get) 
      {
	size_t N = n > 0 ? size_t(n) : n == 0 ? strlen(get) : size_t(INT_MAX);
	
	if (put) 
	  {
	    setg(get, get, put);
	    setp(put, put + N);
	  }
	else 
	  setg(get, get, get + N);
      }
  }

  istrstream::istrstream(char* s)
  : basic_ios<char>(), basic_istream<char>(0), _M_buf(s, 0)
  { basic_ios<char>::init(&_M_buf); }

  istrstream::istrstream(const char* s)
  : basic_ios<char>(), basic_istream<char>(0), _M_buf(s, 0)
  { basic_ios<char>::init(&_M_buf); }

  istrstream::istrstream(char* s, streamsize n)
  : basic_ios<char>(), basic_istream<char>(0), _M_buf(s, n)
  { basic_ios<char>::init(&_M_buf); }

  istrstream::istrstream(const char* s, streamsize n)
  : basic_ios<char>(), basic_istream<char>(0), _M_buf(s, n)
  { basic_ios<char>::init(&_M_buf); }

  istrstream::~istrstream() { }

  strstreambuf* 
  istrstream::rdbuf() const 
  { return const_cast<strstreambuf*>(&_M_buf); }

  char* 
  istrstream::str() 
  { return _M_buf.str(); }

  ostrstream::ostrstream()
  : basic_ios<char>(), basic_ostream<char>(0), _M_buf()
  { basic_ios<char>::init(&_M_buf); }

  ostrstream::ostrstream(char* s, int n, ios_base::openmode mode)
  : basic_ios<char>(), basic_ostream<char>(0), 
    _M_buf(s, n, mode & ios_base::app ? s + strlen(s) : s)
  { basic_ios<char>::init(&_M_buf); }

  ostrstream::~ostrstream() {}

  strstreambuf* 
  ostrstream::rdbuf() const
  { return const_cast<strstreambuf*>(&_M_buf); }

  void 
  ostrstream::freeze(bool freezeflag)
  { _M_buf.freeze(freezeflag); }

  char* 
  ostrstream::str()
  { return _M_buf.str(); }

  int 
  ostrstream::pcount() const
  { return _M_buf.pcount(); }

  strstream::strstream()
  : basic_ios<char>(), basic_iostream<char>(0), _M_buf()
  { basic_ios<char>::init(&_M_buf); }

  strstream::strstream(char* s, int n, ios_base::openmode mode)
  : basic_ios<char>(), basic_iostream<char>(0), 
    _M_buf(s, n, mode & ios_base::app ? s + strlen(s) : s)
  { basic_ios<char>::init(&_M_buf); }

  strstream::~strstream() { }

  strstreambuf* 
  strstream::rdbuf() const
  { return const_cast<strstreambuf*>(&_M_buf); }

  void 
  strstream::freeze(bool freezeflag)
  { _M_buf.freeze(freezeflag); }

  int 
  strstream::pcount() const
  { return _M_buf.pcount(); }

  char* 
  strstream::str()
  { return _M_buf.str(); }

_GLIBCXX_END_NAMESPACE
