home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / stdio_filebuf.h < prev    next >
C/C++ Source or Header  |  2005-01-29  |  6KB  |  163 lines

  1. // File descriptor layer for filebuf -*- C++ -*-
  2.  
  3. // Copyright (C) 2002, 2003, 2004 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 2, 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. // You should have received a copy of the GNU General Public License along
  17. // with this library; see the file COPYING.  If not, write to the Free
  18. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  19. // USA.
  20.  
  21. // As a special exception, you may use this file as part of a free software
  22. // library without restriction.  Specifically, if other files instantiate
  23. // templates or use macros or inline functions from this file, or you compile
  24. // this file and link it with other files to produce an executable, this
  25. // file does not by itself cause the resulting executable to be covered by
  26. // the GNU General Public License.  This exception does not however
  27. // invalidate any other reasons why the executable file might be covered by
  28. // the GNU General Public License.
  29.  
  30. /** @file ext/stdio_filebuf.h
  31.  *  This file is a GNU extension to the Standard C++ Library.
  32.  */
  33.  
  34. #ifndef _STDIO_FILEBUF_H
  35. #define _STDIO_FILEBUF_H 1
  36.  
  37. #pragma GCC system_header
  38.  
  39. #include <fstream>
  40.  
  41. namespace __gnu_cxx
  42. {
  43.   /**
  44.    *  @class stdio_filebuf ext/stdio_filebuf.h <ext/stdio_filebuf.h>
  45.    *  @brief Provides a layer of compatibility for C/POSIX.
  46.    *
  47.    *  This GNU extension provides extensions for working with standard C
  48.    *  FILE*'s and POSIX file descriptors.  It must be instantiated by the
  49.    *  user with the type of character used in the file stream, e.g.,
  50.    *  stdio_filebuf<char>.
  51.   */
  52.   template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
  53.     class stdio_filebuf : public std::basic_filebuf<_CharT, _Traits>
  54.     {
  55.     public:
  56.       // Types:
  57.       typedef _CharT                        char_type;
  58.       typedef _Traits                        traits_type;
  59.       typedef typename traits_type::int_type        int_type;
  60.       typedef typename traits_type::pos_type        pos_type;
  61.       typedef typename traits_type::off_type        off_type;
  62.       typedef std::size_t                               size_t;
  63.  
  64.     public:
  65.       /**
  66.        * deferred initialization
  67.       */
  68.       stdio_filebuf() : std::basic_filebuf<_CharT, _Traits>() {}
  69.  
  70.       /**
  71.        *  @param  fd  An open file descriptor.
  72.        *  @param  mode  Same meaning as in a standard filebuf.
  73.        *  @param  size  Optimal or preferred size of internal buffer, in chars.
  74.        *
  75.        *  This constructor associates a file stream buffer with an open
  76.        *  POSIX file descriptor. The file descriptor will be automatically
  77.        *  closed when the stdio_filebuf is closed/destroyed.
  78.       */
  79.       stdio_filebuf(int __fd, std::ios_base::openmode __mode,
  80.             size_t __size = static_cast<size_t>(BUFSIZ));
  81.  
  82.       /**
  83.        *  @param  f  An open @c FILE*.
  84.        *  @param  mode  Same meaning as in a standard filebuf.
  85.        *  @param  size  Optimal or preferred size of internal buffer, in chars.
  86.        *                Defaults to system's @c BUFSIZ.
  87.        *
  88.        *  This constructor associates a file stream buffer with an open
  89.        *  C @c FILE*.  The @c FILE* will not be automatically closed when the
  90.        *  stdio_filebuf is closed/destroyed.
  91.       */
  92.       stdio_filebuf(std::__c_file* __f, std::ios_base::openmode __mode,
  93.             size_t __size = static_cast<size_t>(BUFSIZ));
  94.  
  95.       /**
  96.        *  Closes the external data stream if the file descriptor constructor
  97.        *  was used.
  98.       */
  99.       virtual
  100.       ~stdio_filebuf();
  101.  
  102.       /**
  103.        *  @return  The underlying file descriptor.
  104.        *
  105.        *  Once associated with an external data stream, this function can be
  106.        *  used to access the underlying POSIX file descriptor.  Note that
  107.        *  there is no way for the library to track what you do with the
  108.        *  descriptor, so be careful.
  109.       */
  110.       int
  111.       fd() { return this->_M_file.fd(); }
  112.  
  113.       /**
  114.        *  @return  The underlying FILE*.
  115.        *
  116.        *  This function can be used to access the underlying "C" file pointer.
  117.        *  Note that there is no way for the library to track what you do
  118.        *  with the file, so be careful.
  119.        */
  120.       std::__c_file*
  121.       file() { return this->_M_file.file(); }
  122.     };
  123.  
  124.   template<typename _CharT, typename _Traits>
  125.     stdio_filebuf<_CharT, _Traits>::~stdio_filebuf()
  126.     { }
  127.  
  128.   template<typename _CharT, typename _Traits>
  129.     stdio_filebuf<_CharT, _Traits>::
  130.     stdio_filebuf(int __fd, std::ios_base::openmode __mode, size_t __size)
  131.     {
  132.       this->_M_file.sys_open(__fd, __mode);
  133.       if (this->is_open())
  134.     {
  135.       this->_M_mode = __mode;
  136.       this->_M_buf_size = __size;
  137.       this->_M_allocate_internal_buffer();
  138.       this->_M_reading = false;
  139.       this->_M_writing = false;
  140.       this->_M_set_buffer(-1);
  141.     }
  142.     }
  143.  
  144.   template<typename _CharT, typename _Traits>
  145.     stdio_filebuf<_CharT, _Traits>::
  146.     stdio_filebuf(std::__c_file* __f, std::ios_base::openmode __mode,
  147.           size_t __size)
  148.     {
  149.       this->_M_file.sys_open(__f, __mode);
  150.       if (this->is_open())
  151.     {
  152.       this->_M_mode = __mode;
  153.       this->_M_buf_size = __size;
  154.       this->_M_allocate_internal_buffer();
  155.       this->_M_reading = false;
  156.       this->_M_writing = false;
  157.       this->_M_set_buffer(-1);
  158.     }
  159.     }
  160. } // namespace __gnu_cxx
  161.  
  162. #endif
  163.