OSDN Git Service

* configure.ac: Set ABI_TWEAKS_SRCDIR.
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / src / strstream.cc
index 5731017..832a19c 100644 (file)
@@ -1,3 +1,32 @@
+// strstream definitions -*- C++ -*-
+
+// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// 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.
 // MAY BE REMOVED in a future standard revision.  You should use the
 // header <sstream> instead.
 
-#include <strstream.h>
+#include <strstream>
 #include <algorithm>
 #include <new>
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
 
-__STL_BEGIN_NAMESPACE
-
-// strstreambuf constructor, destructor.
-
-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 = 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);
+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(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 = max(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();
+  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);
       }
-
-      setp(buf, buf + new_size);
-      pbump(old_size);
-
-      if (reposition_get)
-        setg(buf, buf + old_get_offset, buf + max(old_get_offset, old_size));
-
-      _M_free(old_buffer);
-    }
   }
 
-  if (pptr() != epptr()) {
-    *pptr() = c;
-    pbump(1);
-    return c;
+  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());
   }
-  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 == (unsigned int)(gptr()[-1])) {   // (u int) added KLUDGE
-      gbump(-1);
-      return c;
-    }
-    else if (!_M_constant) {
-      gbump(-1);
-      *gptr() = c;
-      return c;
-    }
+  void 
+  strstreambuf::freeze(bool frozenflag)
+  {
+    if (_M_dynamic)
+      _M_frozen = frozenflag;
   }
 
-  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));
+  char* 
+  strstreambuf::str()
+  {
+    freeze(true);
+    return eback();
   }
 
-  off += newoff;
-  if (off < 0 || off > seekhigh - seeklow)
-    return pos_type(off_type(-1));
+  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();
+  }
 
-  if (do_put) {
-    if (seeklow + off < pbase()) {
-      setp(seeklow, epptr());
-      pbump(off);
-    }
-    else {
-      setp(pbase(), epptr());
-      pbump(off - (pbase() - seeklow));
+  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();
   }
-  if (do_get) {
-    if (off <= egptr() - seeklow)
-      setg(seeklow, seeklow + off, egptr());
-    else if (off <= pptr() - seeklow)
-      setg(seeklow, seeklow + off, pptr());
+
+  strstreambuf::int_type 
+  strstreambuf::underflow()
+  {
+    if (gptr() == egptr() && pptr() && pptr() > egptr())
+      setg(eback(), gptr(), pptr());
+    
+    if (gptr() != egptr())
+      return (unsigned char) *gptr();
     else
-      setg(seeklow, seeklow + off, epptr());
+      return _Traits::eof();
   }
 
-  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);
-}
+  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);
+  }
 
-char* strstreambuf::_M_alloc(size_t n)
-{
-  if (_M_alloc_fun)
-    return static_cast<char*>(_M_alloc_fun(n));
-  else
-    return new char[n];
-}
+  strstreambuf::pos_type
+  strstreambuf::seekpos(pos_type pos, ios_base::openmode mode)
+  { return seekoff(pos - pos_type(off_type(0)), ios_base::beg, mode); }
 
-void strstreambuf::_M_free(char* p)
-{
-  if (p)
-    if (_M_free_fun)
-      _M_free_fun(p);
+  char* 
+  strstreambuf::_M_alloc(size_t n)
+  {
+    if (_M_alloc_fun)
+      return static_cast<char*>(_M_alloc_fun(n));
     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);
+      return new char[n];
+  }
 
-    if (put) {
-      setg(get, get, put);
-      setp(put, put + N);
-    }
-    else {
-      setg(get, get, get + N);
-    }
+  void 
+  strstreambuf::_M_free(char* p)
+  {
+    if (p)
+      if (_M_free_fun)
+       _M_free_fun(p);
+      else
+       delete[] p;
   }
-}
 
-//----------------------------------------------------------------------
-// Class istrstream
+  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)
+  istrstream::istrstream(char* s)
   : basic_ios<char>(), basic_istream<char>(0), _M_buf(s, 0)
-{
-  basic_ios<char>::init(&_M_buf);
-}
+  { basic_ios<char>::init(&_M_buf); }
 
-istrstream::istrstream(const char* s)
+  istrstream::istrstream(const char* s)
   : basic_ios<char>(), basic_istream<char>(0), _M_buf(s, 0)
-{
-  basic_ios<char>::init(&_M_buf);
-}
+  { basic_ios<char>::init(&_M_buf); }
 
-istrstream::istrstream(char* s, streamsize n)
+  istrstream::istrstream(char* s, streamsize n)
   : basic_ios<char>(), basic_istream<char>(0), _M_buf(s, n)
-{
-  basic_ios<char>::init(&_M_buf);
-}
+  { basic_ios<char>::init(&_M_buf); }
 
-istrstream::istrstream(const char* s, streamsize n)
+  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() {}
+  { basic_ios<char>::init(&_M_buf); }
 
-strstreambuf* istrstream::rdbuf() const {
-  return const_cast<strstreambuf*>(&_M_buf);
-}
+  istrstream::~istrstream() { }
 
-char* istrstream::str() { return _M_buf.str(); }
+  strstreambuf* 
+  istrstream::rdbuf() const 
+  { return const_cast<strstreambuf*>(&_M_buf); }
 
-//----------------------------------------------------------------------
-// Class ostrstream
+  char* 
+  istrstream::str() 
+  { return _M_buf.str(); }
 
-ostrstream::ostrstream()
+  ostrstream::ostrstream()
   : basic_ios<char>(), basic_ostream<char>(0), _M_buf()
-{
-  basic_ios<char>::init(&_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),
+  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);
-}
+  { basic_ios<char>::init(&_M_buf); }
 
-ostrstream::~ostrstream() {}
+  ostrstream::~ostrstream() {}
 
-strstreambuf* ostrstream::rdbuf() const
-{
-  return const_cast<strstreambuf*>(&_M_buf);
-}
+  strstreambuf* 
+  ostrstream::rdbuf() const
+  { return const_cast<strstreambuf*>(&_M_buf); }
 
-void ostrstream::freeze(bool freezeflag)
-{
-  _M_buf.freeze(freezeflag);
-}
+  void 
+  ostrstream::freeze(bool freezeflag)
+  { _M_buf.freeze(freezeflag); }
 
-char* ostrstream::str()
-{
-  return _M_buf.str();
-}
+  char* 
+  ostrstream::str()
+  { return _M_buf.str(); }
 
-int ostrstream::pcount() const
-{
-  return _M_buf.pcount();
-}
-
-//----------------------------------------------------------------------
-// Class strstream
+  int 
+  ostrstream::pcount() const
+  { return _M_buf.pcount(); }
 
-strstream::strstream()
+  strstream::strstream()
   : basic_ios<char>(), basic_iostream<char>(0), _M_buf()
-{
-  basic_ios<char>::init(&_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),
+  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() {}
+  { basic_ios<char>::init(&_M_buf); }
 
-strstreambuf* strstream::rdbuf() const
-{
-  return const_cast<strstreambuf*>(&_M_buf);
-}
+  strstream::~strstream() { }
 
-void strstream::freeze(bool freezeflag)
-{
-  _M_buf.freeze(freezeflag);
-}
+  strstreambuf* 
+  strstream::rdbuf() const
+  { return const_cast<strstreambuf*>(&_M_buf); }
 
-int strstream::pcount() const
-{
-  return _M_buf.pcount();
-}
-
-char* strstream::str()
-{
-  return _M_buf.str();
-}
+  void 
+  strstream::freeze(bool freezeflag)
+  { _M_buf.freeze(freezeflag); }
 
-__STL_END_NAMESPACE
+  int 
+  strstream::pcount() const
+  { return _M_buf.pcount(); }
 
-// Local Variables:
-// mode:C++
-// End:
+  char* 
+  strstream::str()
+  { return _M_buf.str(); }
+} // namespace std