Home | History | Annotate | Download | only in stl
      1 /*
      2  * Copyright (c) 1999
      3  * Silicon Graphics Computer Systems, Inc.
      4  *
      5  * Copyright (c) 1999
      6  * Boris Fomitchev
      7  *
      8  * This material is provided "as is", with absolutely no warranty expressed
      9  * or implied. Any use is at your own risk.
     10  *
     11  * Permission to use or copy this software for any purpose is hereby granted
     12  * without fee, provided the above notices are retained on all copies.
     13  * Permission to modify the code and to distribute modified code is granted,
     14  * provided the above notices are retained, and a notice that the code was
     15  * modified is included with the above copyright notice.
     16  *
     17  */
     18 #ifndef _STLP_STREAMBUF_C
     19 #define _STLP_STREAMBUF_C
     20 
     21 #ifndef _STLP_INTERNAL_STREAMBUF
     22 #  include <stl/_streambuf.h>
     23 #endif
     24 
     25 _STLP_BEGIN_NAMESPACE
     26 //----------------------------------------------------------------------
     27 // Non-inline basic_streambuf<> member functions.
     28 
     29 #if !defined (_STLP_MSVC) || (_STLP_MSVC >= 1300) || !defined (_STLP_USE_STATIC_LIB)
     30 template <class _CharT, class _Traits>
     31 basic_streambuf<_CharT, _Traits>::basic_streambuf()
     32   : _M_gbegin(0), _M_gnext(0), _M_gend(0),
     33     _M_pbegin(0), _M_pnext(0), _M_pend(0),
     34     _M_locale() {
     35   //  _M_lock._M_initialize();
     36 }
     37 #endif
     38 
     39 template <class _CharT, class _Traits>
     40 basic_streambuf<_CharT, _Traits>::~basic_streambuf()
     41 {}
     42 
     43 template <class _CharT, class _Traits>
     44 locale
     45 basic_streambuf<_CharT, _Traits>::pubimbue(const locale& __loc) {
     46   this->imbue(__loc);
     47   locale __tmp = _M_locale;
     48   _M_locale = __loc;
     49   return __tmp;
     50 }
     51 
     52 template <class _CharT, class _Traits>
     53 streamsize
     54 basic_streambuf<_CharT, _Traits>::xsgetn(_CharT* __s, streamsize __n) {
     55   streamsize __result = 0;
     56   const int_type __eof = _Traits::eof();
     57 
     58   while (__result < __n) {
     59     if (_M_gnext < _M_gend) {
     60       size_t __chunk = (min) (__STATIC_CAST(size_t,_M_gend - _M_gnext),
     61                               __STATIC_CAST(size_t,__n - __result));
     62       _Traits::copy(__s, _M_gnext, __chunk);
     63       __result += __chunk;
     64       __s += __chunk;
     65       _M_gnext += __chunk;
     66     }
     67     else {
     68       int_type __c = this->sbumpc();
     69       if (!_Traits::eq_int_type(__c, __eof)) {
     70         *__s = _Traits::to_char_type(__c);
     71         ++__result;
     72         ++__s;
     73       }
     74       else
     75         break;
     76     }
     77   }
     78 
     79   return __result;
     80 }
     81 
     82 template <class _CharT, class _Traits>
     83 streamsize
     84 basic_streambuf<_CharT, _Traits>::xsputn(const _CharT* __s, streamsize __n)
     85 {
     86   streamsize __result = 0;
     87   const int_type __eof = _Traits::eof();
     88 
     89   while (__result < __n) {
     90     if (_M_pnext < _M_pend) {
     91       size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
     92                            __STATIC_CAST(size_t,__n - __result));
     93       _Traits::copy(_M_pnext, __s, __chunk);
     94       __result += __chunk;
     95       __s += __chunk;
     96       _M_pnext += __chunk;
     97     }
     98 
     99     else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(*__s)),
    100                                    __eof)) {
    101       ++__result;
    102       ++__s;
    103     }
    104     else
    105       break;
    106   }
    107   return __result;
    108 }
    109 
    110 template <class _CharT, class _Traits>
    111 streamsize
    112 basic_streambuf<_CharT, _Traits>::_M_xsputnc(_CharT __c, streamsize __n)
    113 {
    114   streamsize __result = 0;
    115   const int_type __eof = _Traits::eof();
    116 
    117   while (__result < __n) {
    118     if (_M_pnext < _M_pend) {
    119       size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
    120                            __STATIC_CAST(size_t,__n - __result));
    121       _Traits::assign(_M_pnext, __chunk, __c);
    122       __result += __chunk;
    123       _M_pnext += __chunk;
    124     }
    125 
    126     else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(__c)),
    127                                    __eof))
    128       ++__result;
    129     else
    130       break;
    131   }
    132   return __result;
    133 }
    134 
    135 template <class _CharT, class _Traits>
    136 _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
    137 basic_streambuf<_CharT, _Traits>::_M_snextc_aux()
    138 {
    139   int_type __eof = _Traits::eof();
    140   if (_M_gend == _M_gnext)
    141     return _Traits::eq_int_type(this->uflow(), __eof) ? __eof : this->sgetc();
    142   else {
    143     _M_gnext = _M_gend;
    144     return this->underflow();
    145   }
    146 }
    147 
    148 template <class _CharT, class _Traits>
    149 _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
    150 basic_streambuf<_CharT, _Traits>::pbackfail(int_type) {
    151  return _Traits::eof();
    152 }
    153 
    154 template <class _CharT, class _Traits>
    155 _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
    156 basic_streambuf<_CharT, _Traits>::overflow(int_type) {
    157   return _Traits::eof();
    158 }
    159 
    160 template <class _CharT, class _Traits>
    161 _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
    162 basic_streambuf<_CharT, _Traits>::uflow() {
    163     return ( _Traits::eq_int_type(this->underflow(),_Traits::eof()) ?
    164              _Traits::eof() :
    165              _Traits::to_int_type(*_M_gnext++));
    166 }
    167 
    168 template <class _CharT, class _Traits>
    169 _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
    170 basic_streambuf<_CharT, _Traits>::underflow()
    171 { return _Traits::eof(); }
    172 
    173 template <class _CharT, class _Traits>
    174 streamsize
    175 basic_streambuf<_CharT, _Traits>::showmanyc()
    176 { return 0; }
    177 
    178 template <class _CharT, class _Traits>
    179 void
    180 basic_streambuf<_CharT, _Traits>::imbue(const locale&) {}
    181 
    182 template <class _CharT, class _Traits>
    183 int
    184 basic_streambuf<_CharT, _Traits>::sync() { return 0; }
    185 
    186 template <class _CharT, class _Traits>
    187 _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type
    188 basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
    189 { return pos_type(-1); }
    190 
    191 template <class _CharT, class _Traits>
    192 _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type
    193 basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
    194                                           ios_base::openmode)
    195 { return pos_type(-1); }
    196 
    197 template <class _CharT, class _Traits>
    198 basic_streambuf<_CharT, _Traits>*
    199 basic_streambuf<_CharT, _Traits>:: setbuf(char_type*, streamsize)
    200 { return this; }
    201 
    202 _STLP_END_NAMESPACE
    203 
    204 #endif
    205 
    206 // Local Variables:
    207 // mode:C++
    208 // End:
    209