stdcpp/src/streambuf.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stdcpp/src/streambuf.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,254 @@
+/*
+ * © Portions copyright (c) 2006-2007 Nokia Corporation.  All rights reserved.
+ *
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+# include "stlport_prefix.h"
+
+
+#include <stl/_streambuf.h>
+#include <stl/_algobase.h>
+
+// Implementation of non-inline member functions of class
+// basic_streambuf<char, char_traits<char> >
+
+# if defined (__hpux)
+#  define FILE_CAST(x) (__REINTERPRET_CAST(FILE*, x))
+# else
+#  define FILE_CAST(x) x
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+#if !defined(_STLP_WINCE)
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >::~basic_streambuf() {}
+
+// This constructor is an extension.  It is for streambuf subclasses that
+// are synchronized with C stdio files.
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >
+  ::basic_streambuf(FILE* __get, FILE* __put)
+    : _M_get(__get ? __get : FILE_CAST(&_M_default_get)),
+      _M_put(__put ? __put : FILE_CAST(&_M_default_put)),
+      _M_locale()
+{
+  _M_lock._M_initialize();
+
+  if (_M_get == FILE_CAST(&_M_default_get))
+    _FILE_I_set(_M_get, 0, 0, 0);
+  if (_M_put == FILE_CAST(&_M_default_put))
+    _FILE_O_set(_M_put, 0, 0, 0);      
+}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >
+        ::basic_streambuf _STLP_PSPEC2(char, char_traits<char>) ()
+    : _M_get(__REINTERPRET_CAST(FILE*,&_M_default_get)),
+      _M_put(__REINTERPRET_CAST(FILE*,&_M_default_put)), _M_locale()
+  {
+    // _M_lock._M_initialize();
+    _FILE_I_set(_M_get, 0, 0, 0);
+    _FILE_O_set(_M_put, 0, 0, 0);
+  }
+
+// virtual functions
+
+_STLP_EXP_DECLSPEC void basic_streambuf<char, char_traits<char> >::imbue(const locale&)
+{}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >*
+basic_streambuf<char, char_traits<char> >::setbuf(char*, streamsize)
+{
+  return this;
+}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >::pos_type
+basic_streambuf<char, char_traits<char> >
+  ::seekoff(off_type, ios_base::seekdir, ios_base::openmode)
+{
+  return pos_type(-1);
+}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >::pos_type
+basic_streambuf<char, char_traits<char> >
+  ::seekpos(pos_type, ios_base::openmode)
+{
+  return pos_type(-1);
+}
+
+_STLP_EXP_DECLSPEC int basic_streambuf<char, char_traits<char> >::sync()
+{
+  return 0;
+}
+
+_STLP_EXP_DECLSPEC streamsize basic_streambuf<char, char_traits<char> >::showmanyc()
+{
+  return 0;
+}
+
+_STLP_EXP_DECLSPEC streamsize basic_streambuf<char, char_traits<char> >
+  ::xsgetn(char* s, streamsize n)
+{
+  streamsize result = 0;
+  const int_type eof = traits_type::eof();
+
+  while (result < n) {
+    if (_FILE_I_avail(_M_get) > 0) {
+      size_t chunk = (min) (__STATIC_CAST(size_t,_FILE_I_avail(_M_get)),
+                         __STATIC_CAST(size_t,n - result));
+      traits_type::copy(s, _FILE_I_next(_M_get), chunk);
+      result += chunk;
+      s += chunk;
+      _FILE_I_bump(_M_get, chunk);
+    }
+    else {
+      int_type c = sbumpc();
+      if (c != eof) {
+        *s = c;
+        ++result;
+	++s;
+      }
+      else
+        break; 
+    }
+  }
+  
+  return result;
+}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >::int_type
+basic_streambuf<char, char_traits<char> >::underflow()
+{
+  return traits_type::eof();
+}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >::int_type
+basic_streambuf<char, char_traits<char> >::uflow()
+{
+  const int_type eof = traits_type::eof();
+  return this->underflow() == eof 
+    ? eof
+    : traits_type::to_int_type(_FILE_I_postincr(_M_get));
+}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >::int_type
+basic_streambuf<char, char_traits<char> >::pbackfail(int_type /* __c */)
+{
+  return traits_type::eof();
+}
+
+
+_STLP_EXP_DECLSPEC streamsize basic_streambuf<char, char_traits<char> >
+  ::xsputn(const char* s, streamsize n)
+{
+  streamsize result = 0;
+  const int_type eof = traits_type::eof();
+
+  while (result < n) {
+    if (_FILE_O_avail(_M_put) > 0) {
+      size_t chunk = (min) (__STATIC_CAST(size_t,_FILE_O_avail(_M_put)),
+                         __STATIC_CAST(size_t,n - result));
+      traits_type::copy(_FILE_O_next(_M_put), s, chunk);
+      result += chunk;
+      s += chunk;
+      _FILE_O_bump(_M_put, (int)chunk);
+    }
+
+    else if (this->overflow(traits_type::to_int_type(*s)) != eof) {
+      ++result;
+      ++s;
+    }
+    else
+      break;
+  }
+  return result;
+}
+
+_STLP_EXP_DECLSPEC streamsize basic_streambuf<char, char_traits<char> >
+  ::_M_xsputnc(char c, streamsize n)
+{
+  streamsize result = 0;
+  const int_type eof = traits_type::eof();
+
+  while (result < n) {
+    if (_FILE_O_avail(_M_put) > 0) {
+      size_t chunk = (min) (__STATIC_CAST(size_t,_FILE_O_avail(_M_put)),
+                         __STATIC_CAST(size_t,n - result));
+      traits_type::assign(_FILE_O_next(_M_put), chunk, c);
+      result += chunk;
+      _FILE_O_bump(_M_put, (int)chunk);
+    }
+
+    else if (this->overflow(traits_type::to_int_type(c)) != eof)
+      ++result;
+    else
+      break;
+  }
+  return result;
+}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >::int_type
+basic_streambuf<char, char_traits<char> >::overflow(int_type/*  c */)
+{
+  return traits_type::eof();
+}
+
+_STLP_EXP_DECLSPEC basic_streambuf<char, char_traits<char> >::int_type
+basic_streambuf<char, char_traits<char> >::_M_snextc_aux()
+{
+  int_type eof = traits_type::eof();
+  if (_FILE_I_avail(_M_get) == 0)
+    return this->uflow() == eof ? eof : this->sgetc();
+  else {
+    _FILE_I_set(_M_get,
+              _FILE_I_begin(_M_get), _FILE_I_end(_M_get), _FILE_I_end(_M_get));
+    return this->underflow();
+  }
+}
+
+
+_STLP_EXP_DECLSPEC locale basic_streambuf<char, char_traits<char> >::pubimbue(const locale& loc)
+{
+  this->imbue(loc);
+  locale tmp = _M_locale;
+  _M_locale = loc;
+  return tmp;
+}
+
+#else
+
+#if !defined(_STLP_NO_FORCE_INSTANTIATE)
+template class basic_streambuf<char, char_traits<char> >;
+#endif
+
+#endif /* _STLP_WINCE */
+
+//----------------------------------------------------------------------
+// Force instantiation of basic_streambuf
+
+// not basic_streambuf<char>, because it's specialized.
+
+#if !defined(_STLP_NO_FORCE_INSTANTIATE)
+#if !defined (_STLP_NO_WCHAR_T)
+template class basic_streambuf<wchar_t, char_traits<wchar_t> >;
+#endif /* INSTANTIATE_WIDE_STREAMS */
+#endif
+
+_STLP_END_NAMESPACE
+
+// Local Variables:
+// mode:C++
+// End: