Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. // Stream buffer classes -*- C++ -*-
  2.  
  3. // Copyright (C) 2004-2013 Free Software Foundation, Inc.
  4. //
  5. // This file is part of the GNU ISO C++ Library.  This library is free
  6. // software; you can redistribute it and/or modify it under the
  7. // terms of the GNU General Public License as published by the
  8. // Free Software Foundation; either version 3, or (at your option)
  9. // any later version.
  10.  
  11. // This library is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. // GNU General Public License for more details.
  15.  
  16. // Under Section 7 of GPL version 3, you are granted additional
  17. // permissions described in the GCC Runtime Library Exception, version
  18. // 3.1, as published by the Free Software Foundation.
  19.  
  20. // You should have received a copy of the GNU General Public License and
  21. // a copy of the GCC Runtime Library Exception along with this program;
  22. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  23. // <http://www.gnu.org/licenses/>.
  24.  
  25. //
  26. // ISO C++ 14882: 27.5  Stream buffers
  27. //
  28.  
  29. #include <streambuf>
  30.  
  31. namespace std _GLIBCXX_VISIBILITY(default)
  32. {
  33. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  34.  
  35.   template<>
  36.     streamsize
  37.     __copy_streambufs_eof(basic_streambuf<char>* __sbin,
  38.                           basic_streambuf<char>* __sbout, bool& __ineof)
  39.     {
  40.       typedef basic_streambuf<char>::traits_type traits_type;
  41.       streamsize __ret = 0;
  42.       __ineof = true;
  43.       traits_type::int_type __c = __sbin->sgetc();
  44.       while (!traits_type::eq_int_type(__c, traits_type::eof()))
  45.         {
  46.           const streamsize __n = __sbin->egptr() - __sbin->gptr();
  47.           if (__n > 1)
  48.             {
  49.               const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n);
  50.               __sbin->__safe_gbump(__wrote);
  51.               __ret += __wrote;
  52.               if (__wrote < __n)
  53.                 {
  54.                   __ineof = false;
  55.                   break;
  56.                 }
  57.               __c = __sbin->underflow();
  58.             }
  59.           else
  60.             {
  61.               __c = __sbout->sputc(traits_type::to_char_type(__c));
  62.               if (traits_type::eq_int_type(__c, traits_type::eof()))
  63.                 {
  64.                   __ineof = false;
  65.                   break;
  66.                 }
  67.               ++__ret;
  68.               __c = __sbin->snextc();
  69.             }
  70.         }
  71.       return __ret;
  72.     }
  73.  
  74. #ifdef _GLIBCXX_USE_WCHAR_T
  75.   template<>
  76.     streamsize
  77.     __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
  78.                           basic_streambuf<wchar_t>* __sbout, bool& __ineof)
  79.     {
  80.       typedef basic_streambuf<wchar_t>::traits_type traits_type;
  81.       streamsize __ret = 0;
  82.       __ineof = true;
  83.       traits_type::int_type __c = __sbin->sgetc();
  84.       while (!traits_type::eq_int_type(__c, traits_type::eof()))
  85.         {
  86.           const streamsize __n = __sbin->egptr() - __sbin->gptr();
  87.           if (__n > 1)
  88.             {
  89.               const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n);
  90.               __sbin->__safe_gbump(__wrote);
  91.               __ret += __wrote;
  92.               if (__wrote < __n)
  93.                 {
  94.                   __ineof = false;
  95.                   break;
  96.                 }
  97.               __c = __sbin->underflow();
  98.             }
  99.           else
  100.             {
  101.               __c = __sbout->sputc(traits_type::to_char_type(__c));
  102.               if (traits_type::eq_int_type(__c, traits_type::eof()))
  103.                 {
  104.                   __ineof = false;
  105.                   break;
  106.                 }
  107.               ++__ret;
  108.               __c = __sbin->snextc();
  109.             }
  110.         }
  111.       return __ret;
  112.     }
  113. #endif
  114.  
  115. _GLIBCXX_END_NAMESPACE_VERSION
  116. } // namespace
  117.