OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc4/] [libstdc++-v3/] [include/] [ext/] [stdio_sync_filebuf.h] - Diff between revs 424 and 519

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 424 Rev 519
// Iostreams wrapper for stdio FILE* -*- C++ -*-
// Iostreams wrapper for stdio FILE* -*- C++ -*-
 
 
// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010
// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010
// Free Software Foundation, Inc.
// Free Software Foundation, Inc.
//
//
// This file is part of the GNU ISO C++ Library.  This library is free
// 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
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// any later version.
 
 
// This library is distributed in the hope that it will be useful,
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// GNU General Public License for more details.
 
 
// Under Section 7 of GPL version 3, you are granted additional
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
// 3.1, as published by the Free Software Foundation.
 
 
// You should have received a copy of the GNU General Public License and
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.
// <http://www.gnu.org/licenses/>.
 
 
/** @file ext/stdio_sync_filebuf.h
/** @file ext/stdio_sync_filebuf.h
 *  This file is a GNU extension to the Standard C++ Library.
 *  This file is a GNU extension to the Standard C++ Library.
 */
 */
 
 
#ifndef _STDIO_SYNC_FILEBUF_H
#ifndef _STDIO_SYNC_FILEBUF_H
#define _STDIO_SYNC_FILEBUF_H 1
#define _STDIO_SYNC_FILEBUF_H 1
 
 
#pragma GCC system_header
#pragma GCC system_header
 
 
#include <streambuf>
#include <streambuf>
#include <unistd.h>
#include <unistd.h>
#include <cstdio>
#include <cstdio>
#include <bits/c++io.h>  // For __c_file
#include <bits/c++io.h>  // For __c_file
 
 
#ifdef _GLIBCXX_USE_WCHAR_T
#ifdef _GLIBCXX_USE_WCHAR_T
#include <cwchar>
#include <cwchar>
#endif
#endif
 
 
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
 
 
  /**
  /**
   *  @brief Provides a layer of compatibility for C.
   *  @brief Provides a layer of compatibility for C.
   *  @ingroup io
   *  @ingroup io
   *
   *
   *  This GNU extension provides extensions for working with standard
   *  This GNU extension provides extensions for working with standard
   *  C FILE*'s.  It must be instantiated by the user with the type of
   *  C FILE*'s.  It must be instantiated by the user with the type of
   *  character used in the file stream, e.g., stdio_filebuf<char>.
   *  character used in the file stream, e.g., stdio_filebuf<char>.
  */
  */
  template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
  template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
    class stdio_sync_filebuf : public std::basic_streambuf<_CharT, _Traits>
    class stdio_sync_filebuf : public std::basic_streambuf<_CharT, _Traits>
    {
    {
    public:
    public:
      // Types:
      // Types:
      typedef _CharT                                    char_type;
      typedef _CharT                                    char_type;
      typedef _Traits                                   traits_type;
      typedef _Traits                                   traits_type;
      typedef typename traits_type::int_type            int_type;
      typedef typename traits_type::int_type            int_type;
      typedef typename traits_type::pos_type            pos_type;
      typedef typename traits_type::pos_type            pos_type;
      typedef typename traits_type::off_type            off_type;
      typedef typename traits_type::off_type            off_type;
 
 
    private:
    private:
      // Underlying stdio FILE
      // Underlying stdio FILE
      std::__c_file* const _M_file;
      std::__c_file* const _M_file;
 
 
      // Last character gotten. This is used when pbackfail is
      // Last character gotten. This is used when pbackfail is
      // called from basic_streambuf::sungetc()
      // called from basic_streambuf::sungetc()
      int_type _M_unget_buf;
      int_type _M_unget_buf;
 
 
    public:
    public:
      explicit
      explicit
      stdio_sync_filebuf(std::__c_file* __f)
      stdio_sync_filebuf(std::__c_file* __f)
      : _M_file(__f), _M_unget_buf(traits_type::eof())
      : _M_file(__f), _M_unget_buf(traits_type::eof())
      { }
      { }
 
 
      /**
      /**
       *  @return  The underlying FILE*.
       *  @return  The underlying FILE*.
       *
       *
       *  This function can be used to access the underlying C file pointer.
       *  This function can be used to access the underlying C file pointer.
       *  Note that there is no way for the library to track what you do
       *  Note that there is no way for the library to track what you do
       *  with the file, so be careful.
       *  with the file, so be careful.
       */
       */
      std::__c_file* const
      std::__c_file* const
      file() { return this->_M_file; }
      file() { return this->_M_file; }
 
 
    protected:
    protected:
      int_type
      int_type
      syncgetc();
      syncgetc();
 
 
      int_type
      int_type
      syncungetc(int_type __c);
      syncungetc(int_type __c);
 
 
      int_type
      int_type
      syncputc(int_type __c);
      syncputc(int_type __c);
 
 
      virtual int_type
      virtual int_type
      underflow()
      underflow()
      {
      {
        int_type __c = this->syncgetc();
        int_type __c = this->syncgetc();
        return this->syncungetc(__c);
        return this->syncungetc(__c);
      }
      }
 
 
      virtual int_type
      virtual int_type
      uflow()
      uflow()
      {
      {
        // Store the gotten character in case we need to unget it.
        // Store the gotten character in case we need to unget it.
        _M_unget_buf = this->syncgetc();
        _M_unget_buf = this->syncgetc();
        return _M_unget_buf;
        return _M_unget_buf;
      }
      }
 
 
      virtual int_type
      virtual int_type
      pbackfail(int_type __c = traits_type::eof())
      pbackfail(int_type __c = traits_type::eof())
      {
      {
        int_type __ret;
        int_type __ret;
        const int_type __eof = traits_type::eof();
        const int_type __eof = traits_type::eof();
 
 
        // Check if the unget or putback was requested
        // Check if the unget or putback was requested
        if (traits_type::eq_int_type(__c, __eof)) // unget
        if (traits_type::eq_int_type(__c, __eof)) // unget
          {
          {
            if (!traits_type::eq_int_type(_M_unget_buf, __eof))
            if (!traits_type::eq_int_type(_M_unget_buf, __eof))
              __ret = this->syncungetc(_M_unget_buf);
              __ret = this->syncungetc(_M_unget_buf);
            else // buffer invalid, fail.
            else // buffer invalid, fail.
              __ret = __eof;
              __ret = __eof;
          }
          }
        else // putback
        else // putback
          __ret = this->syncungetc(__c);
          __ret = this->syncungetc(__c);
 
 
        // The buffered character is no longer valid, discard it.
        // The buffered character is no longer valid, discard it.
        _M_unget_buf = __eof;
        _M_unget_buf = __eof;
        return __ret;
        return __ret;
      }
      }
 
 
      virtual std::streamsize
      virtual std::streamsize
      xsgetn(char_type* __s, std::streamsize __n);
      xsgetn(char_type* __s, std::streamsize __n);
 
 
      virtual int_type
      virtual int_type
      overflow(int_type __c = traits_type::eof())
      overflow(int_type __c = traits_type::eof())
      {
      {
        int_type __ret;
        int_type __ret;
        if (traits_type::eq_int_type(__c, traits_type::eof()))
        if (traits_type::eq_int_type(__c, traits_type::eof()))
          {
          {
            if (std::fflush(_M_file))
            if (std::fflush(_M_file))
              __ret = traits_type::eof();
              __ret = traits_type::eof();
            else
            else
              __ret = traits_type::not_eof(__c);
              __ret = traits_type::not_eof(__c);
          }
          }
        else
        else
          __ret = this->syncputc(__c);
          __ret = this->syncputc(__c);
        return __ret;
        return __ret;
      }
      }
 
 
      virtual std::streamsize
      virtual std::streamsize
      xsputn(const char_type* __s, std::streamsize __n);
      xsputn(const char_type* __s, std::streamsize __n);
 
 
      virtual int
      virtual int
      sync()
      sync()
      { return std::fflush(_M_file); }
      { return std::fflush(_M_file); }
 
 
      virtual std::streampos
      virtual std::streampos
      seekoff(std::streamoff __off, std::ios_base::seekdir __dir,
      seekoff(std::streamoff __off, std::ios_base::seekdir __dir,
              std::ios_base::openmode = std::ios_base::in | std::ios_base::out)
              std::ios_base::openmode = std::ios_base::in | std::ios_base::out)
      {
      {
        std::streampos __ret(std::streamoff(-1));
        std::streampos __ret(std::streamoff(-1));
        int __whence;
        int __whence;
        if (__dir == std::ios_base::beg)
        if (__dir == std::ios_base::beg)
          __whence = SEEK_SET;
          __whence = SEEK_SET;
        else if (__dir == std::ios_base::cur)
        else if (__dir == std::ios_base::cur)
          __whence = SEEK_CUR;
          __whence = SEEK_CUR;
        else
        else
          __whence = SEEK_END;
          __whence = SEEK_END;
#ifdef _GLIBCXX_USE_LFS
#ifdef _GLIBCXX_USE_LFS
        if (!fseeko64(_M_file, __off, __whence))
        if (!fseeko64(_M_file, __off, __whence))
          __ret = std::streampos(ftello64(_M_file));
          __ret = std::streampos(ftello64(_M_file));
#else
#else
        if (!fseek(_M_file, __off, __whence))
        if (!fseek(_M_file, __off, __whence))
          __ret = std::streampos(std::ftell(_M_file));
          __ret = std::streampos(std::ftell(_M_file));
#endif
#endif
        return __ret;
        return __ret;
      }
      }
 
 
      virtual std::streampos
      virtual std::streampos
      seekpos(std::streampos __pos,
      seekpos(std::streampos __pos,
              std::ios_base::openmode __mode =
              std::ios_base::openmode __mode =
              std::ios_base::in | std::ios_base::out)
              std::ios_base::in | std::ios_base::out)
      { return seekoff(std::streamoff(__pos), std::ios_base::beg, __mode); }
      { return seekoff(std::streamoff(__pos), std::ios_base::beg, __mode); }
    };
    };
 
 
  template<>
  template<>
    inline stdio_sync_filebuf<char>::int_type
    inline stdio_sync_filebuf<char>::int_type
    stdio_sync_filebuf<char>::syncgetc()
    stdio_sync_filebuf<char>::syncgetc()
    { return std::getc(_M_file); }
    { return std::getc(_M_file); }
 
 
  template<>
  template<>
    inline stdio_sync_filebuf<char>::int_type
    inline stdio_sync_filebuf<char>::int_type
    stdio_sync_filebuf<char>::syncungetc(int_type __c)
    stdio_sync_filebuf<char>::syncungetc(int_type __c)
    { return std::ungetc(__c, _M_file); }
    { return std::ungetc(__c, _M_file); }
 
 
  template<>
  template<>
    inline stdio_sync_filebuf<char>::int_type
    inline stdio_sync_filebuf<char>::int_type
    stdio_sync_filebuf<char>::syncputc(int_type __c)
    stdio_sync_filebuf<char>::syncputc(int_type __c)
    { return std::putc(__c, _M_file); }
    { return std::putc(__c, _M_file); }
 
 
  template<>
  template<>
    inline std::streamsize
    inline std::streamsize
    stdio_sync_filebuf<char>::xsgetn(char* __s, std::streamsize __n)
    stdio_sync_filebuf<char>::xsgetn(char* __s, std::streamsize __n)
    {
    {
      std::streamsize __ret = std::fread(__s, 1, __n, _M_file);
      std::streamsize __ret = std::fread(__s, 1, __n, _M_file);
      if (__ret > 0)
      if (__ret > 0)
        _M_unget_buf = traits_type::to_int_type(__s[__ret - 1]);
        _M_unget_buf = traits_type::to_int_type(__s[__ret - 1]);
      else
      else
        _M_unget_buf = traits_type::eof();
        _M_unget_buf = traits_type::eof();
      return __ret;
      return __ret;
    }
    }
 
 
  template<>
  template<>
    inline std::streamsize
    inline std::streamsize
    stdio_sync_filebuf<char>::xsputn(const char* __s, std::streamsize __n)
    stdio_sync_filebuf<char>::xsputn(const char* __s, std::streamsize __n)
    { return std::fwrite(__s, 1, __n, _M_file); }
    { return std::fwrite(__s, 1, __n, _M_file); }
 
 
#ifdef _GLIBCXX_USE_WCHAR_T
#ifdef _GLIBCXX_USE_WCHAR_T
  template<>
  template<>
    inline stdio_sync_filebuf<wchar_t>::int_type
    inline stdio_sync_filebuf<wchar_t>::int_type
    stdio_sync_filebuf<wchar_t>::syncgetc()
    stdio_sync_filebuf<wchar_t>::syncgetc()
    { return std::getwc(_M_file); }
    { return std::getwc(_M_file); }
 
 
  template<>
  template<>
    inline stdio_sync_filebuf<wchar_t>::int_type
    inline stdio_sync_filebuf<wchar_t>::int_type
    stdio_sync_filebuf<wchar_t>::syncungetc(int_type __c)
    stdio_sync_filebuf<wchar_t>::syncungetc(int_type __c)
    { return std::ungetwc(__c, _M_file); }
    { return std::ungetwc(__c, _M_file); }
 
 
  template<>
  template<>
    inline stdio_sync_filebuf<wchar_t>::int_type
    inline stdio_sync_filebuf<wchar_t>::int_type
    stdio_sync_filebuf<wchar_t>::syncputc(int_type __c)
    stdio_sync_filebuf<wchar_t>::syncputc(int_type __c)
    { return std::putwc(__c, _M_file); }
    { return std::putwc(__c, _M_file); }
 
 
  template<>
  template<>
    inline std::streamsize
    inline std::streamsize
    stdio_sync_filebuf<wchar_t>::xsgetn(wchar_t* __s, std::streamsize __n)
    stdio_sync_filebuf<wchar_t>::xsgetn(wchar_t* __s, std::streamsize __n)
    {
    {
      std::streamsize __ret = 0;
      std::streamsize __ret = 0;
      const int_type __eof = traits_type::eof();
      const int_type __eof = traits_type::eof();
      while (__n--)
      while (__n--)
        {
        {
          int_type __c = this->syncgetc();
          int_type __c = this->syncgetc();
          if (traits_type::eq_int_type(__c, __eof))
          if (traits_type::eq_int_type(__c, __eof))
            break;
            break;
          __s[__ret] = traits_type::to_char_type(__c);
          __s[__ret] = traits_type::to_char_type(__c);
          ++__ret;
          ++__ret;
        }
        }
 
 
      if (__ret > 0)
      if (__ret > 0)
        _M_unget_buf = traits_type::to_int_type(__s[__ret - 1]);
        _M_unget_buf = traits_type::to_int_type(__s[__ret - 1]);
      else
      else
        _M_unget_buf = traits_type::eof();
        _M_unget_buf = traits_type::eof();
      return __ret;
      return __ret;
    }
    }
 
 
  template<>
  template<>
    inline std::streamsize
    inline std::streamsize
    stdio_sync_filebuf<wchar_t>::xsputn(const wchar_t* __s,
    stdio_sync_filebuf<wchar_t>::xsputn(const wchar_t* __s,
                                        std::streamsize __n)
                                        std::streamsize __n)
    {
    {
      std::streamsize __ret = 0;
      std::streamsize __ret = 0;
      const int_type __eof = traits_type::eof();
      const int_type __eof = traits_type::eof();
      while (__n--)
      while (__n--)
        {
        {
          if (traits_type::eq_int_type(this->syncputc(*__s++), __eof))
          if (traits_type::eq_int_type(this->syncputc(*__s++), __eof))
            break;
            break;
          ++__ret;
          ++__ret;
        }
        }
      return __ret;
      return __ret;
    }
    }
#endif
#endif
 
 
#if _GLIBCXX_EXTERN_TEMPLATE
#if _GLIBCXX_EXTERN_TEMPLATE
  extern template class stdio_sync_filebuf<char>;
  extern template class stdio_sync_filebuf<char>;
#ifdef _GLIBCXX_USE_WCHAR_T
#ifdef _GLIBCXX_USE_WCHAR_T
  extern template class stdio_sync_filebuf<wchar_t>;
  extern template class stdio_sync_filebuf<wchar_t>;
#endif
#endif
#endif
#endif
 
 
_GLIBCXX_END_NAMESPACE
_GLIBCXX_END_NAMESPACE
 
 
#endif
#endif
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.