williamr@2: /* williamr@2: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: // This header defines classes basic_filebuf, basic_ifstream, williamr@2: // basic_ofstream, and basic_fstream. These classes represent williamr@2: // streambufs and streams whose sources or destinations are files. williamr@2: williamr@2: #ifndef _STLP_INTERNAL_FSTREAM_H williamr@2: #define _STLP_INTERNAL_FSTREAM_H williamr@2: williamr@2: #if defined(__sgi) && !defined(__GNUC__) && !defined(_STANDARD_C_PLUS_PLUS) williamr@2: #error This header file requires the -LANG:std option williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_STREAMBUF williamr@2: # include williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_ISTREAM_H williamr@2: #include williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_CODECVT_H williamr@2: #include williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_STDIO_FILE_H williamr@2: #include williamr@2: #endif williamr@2: williamr@2: // fbp : let us map 1 MB maximum, just be sure not to trash VM williamr@2: //for hardware defining 8kb of mmap chunk williamr@2: # ifdef __SYMBIAN32__ williamr@2: # define MMAP_CHUNK 0x2000UL williamr@2: # else williamr@2: # define MMAP_CHUNK 0x100000UL williamr@2: # endif williamr@2: williamr@2: #if !defined (_STLP_USE_UNIX_IO) && !defined(_STLP_USE_WIN32_IO) \ williamr@2: && ! defined (_STLP_USE_UNIX_EMULATION_IO) && !defined (_STLP_USE_STDIO_IO) williamr@2: williamr@2: # if defined (_STLP_UNIX) || defined (__CYGWIN__) || defined (__amigaos__) || defined (__EMX__) || defined (__SYMBIAN32__) williamr@2: // open/close/read/write williamr@2: # define _STLP_USE_UNIX_IO williamr@2: # elif defined (_STLP_WIN32) && ! defined (__CYGWIN__) williamr@2: // CreateFile/ReadFile/WriteFile williamr@2: # define _STLP_USE_WIN32_IO williamr@2: # elif defined (_STLP_WIN16) || defined (_STLP_WIN32) || defined (_STLP_MAC) williamr@2: // _open/_read/_write williamr@2: # define _STLP_USE_UNIX_EMULATION_IO williamr@2: # else williamr@2: // fopen/fread/fwrite williamr@2: # define _STLP_USE_STDIO_IO williamr@2: # endif /* _STLP_UNIX */ williamr@2: williamr@2: #endif /* mode selection */ williamr@2: williamr@2: williamr@2: #if defined (_STLP_USE_WIN32_IO) williamr@2: typedef void* _STLP_fd; williamr@2: #elif defined (_STLP_USE_UNIX_EMULATION_IO) || defined (_STLP_USE_STDIO_IO) || defined (_STLP_USE_UNIX_IO) williamr@2: typedef int _STLP_fd; williamr@2: #else williamr@2: #error "Configure i/o !" williamr@2: #endif williamr@2: williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: #if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) williamr@2: _STLP_DECLSPEC size_t& get_fstream_Filebuf_Base_GetPageSize(); williamr@2: #endif //__LIBSTD_CPP_SYMBIAN32_WSD__ williamr@2: //---------------------------------------------------------------------- williamr@2: // Class _Filebuf_base, a private base class to factor out the system- williamr@2: // dependent code from basic_filebuf<>. williamr@2: williamr@2: class _STLP_CLASS_DECLSPEC _Filebuf_base { williamr@2: public: // Opening and closing files. williamr@2: _STLP_DECLSPEC _Filebuf_base(); williamr@2: williamr@2: _STLP_DECLSPEC bool _M_open(const char*, ios_base::openmode, long __protection); williamr@2: _STLP_DECLSPEC bool _M_open(const char*, ios_base::openmode); williamr@2: _STLP_DECLSPEC bool _M_open(int __id, ios_base::openmode = ios_base::__default_mode); williamr@2: _STLP_DECLSPEC bool _M_close(); williamr@2: williamr@2: public: // Low-level I/O, like Unix read/write williamr@2: _STLP_DECLSPEC ptrdiff_t _M_read(char* __buf, ptrdiff_t __n); williamr@2: _STLP_DECLSPEC streamoff _M_seek(streamoff __offset, ios_base::seekdir __dir); williamr@2: _STLP_DECLSPEC streamoff _M_file_size(); williamr@2: _STLP_DECLSPEC bool _M_write(char* __buf, ptrdiff_t __n); williamr@2: williamr@2: public: // Memory-mapped I/O. williamr@2: _STLP_DECLSPEC void* _M_mmap(streamoff __offset, streamoff __len); williamr@2: _STLP_DECLSPEC void _M_unmap(void* __mmap_base, streamoff __len); williamr@2: williamr@2: public: williamr@2: // Returns a value n such that, if pos is the file pointer at the williamr@2: // beginning of the range [first, last), pos + n is the file pointer at williamr@2: // the end. On many operating systems n == __last - __first. williamr@2: // In Unix, writing n characters always bumps the file position by n. williamr@2: // In Windows text mode, however, it bumps the file position by n + m, williamr@2: // where m is the number of newlines in the range. That's because an williamr@2: // internal \n corresponds to an external two-character sequence. williamr@2: streamoff _M_get_offset(char* __first, char* __last) { williamr@2: #if defined (_STLP_UNIX) || defined (_STLP_MAC) williamr@2: return __last - __first; williamr@2: #else // defined (_STLP_WIN32) || defined (_STLP_WIN16) || defined (_STLP_DOS) williamr@2: return ( (_M_openmode & ios_base::binary) != 0 ) williamr@2: ? (__last - __first) williamr@2: : count(__first, __last, '\n') + (__last - __first); williamr@2: #endif williamr@2: } williamr@2: williamr@2: // Returns true if we're in binary mode or if we're using an OS or file williamr@2: // system where there is no distinction between text and binary mode. williamr@2: bool _M_in_binary_mode() const { williamr@2: # if defined (_STLP_UNIX) || defined (_STLP_MAC) || defined(__BEOS__) || defined (__amigaos__) || defined (_STLP_VXWORKS_TORNADO) williamr@2: return true; williamr@2: # elif defined (_STLP_WIN32) || defined (_STLP_WIN16) || defined (_STLP_DOS) || defined (_STLP_VM) || defined (__EMX__) williamr@2: return (_M_openmode & ios_base::binary) != 0; williamr@2: # else williamr@2: //# error "Port!" williamr@2: #pragma message(" Symbian I/O stream support on progress."__FILE__) williamr@2: # endif williamr@2: } williamr@2: williamr@2: protected: // Static data members. williamr@2: # if !defined(__LIBSTD_CPP_SYMBIAN32_WSD__) && !defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) williamr@2: static size_t _M_page_size; williamr@2: #endif //__SYMBIAN32__ williamr@2: williamr@2: protected: // Data members. williamr@2: _STLP_fd _M_file_id; williamr@2: # ifdef _STLP_USE_STDIO_IO williamr@2: // for stdio, the whole FILE* is being kept here williamr@2: FILE* _M_file; williamr@2: # endif williamr@2: # ifdef _STLP_USE_WIN32_IO williamr@2: void* _M_view_id; williamr@2: # endif williamr@2: williamr@2: ios_base::openmode _M_openmode ; williamr@2: unsigned char _M_is_open ; williamr@2: unsigned char _M_should_close ; williamr@2: unsigned char _M_regular_file ; williamr@2: williamr@2: public : williamr@2: #if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) williamr@2: static size_t _STLP_CALL __page_size() { return get_fstream_Filebuf_Base_GetPageSize(); } williamr@2: #else williamr@2: static size_t _STLP_CALL __page_size() { return _M_page_size; } williamr@2: #endif williamr@2: int __o_mode() const { return (int)_M_openmode; } williamr@2: bool __is_open() const { return (_M_is_open !=0 ); } williamr@2: bool __should_close() const { return (_M_should_close != 0); } williamr@2: bool __regular_file() const { return (_M_regular_file != 0); } williamr@2: _STLP_fd __get_fd() const { return _M_file_id; } williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class basic_filebuf<>. williamr@2: williamr@2: // Forward declaration of two helper classes. williamr@2: template class _Noconv_input; williamr@2: _STLP_TEMPLATE_NULL williamr@2: class _Noconv_input >; williamr@2: williamr@2: template class _Noconv_output; williamr@2: _STLP_TEMPLATE_NULL williamr@2: class _Noconv_output< char_traits >; williamr@2: williamr@2: // There is a specialized version of underflow, for basic_filebuf, williamr@2: // in fstream.cxx. williamr@2: williamr@2: template williamr@2: class _Underflow; williamr@2: williamr@2: _STLP_TEMPLATE_NULL class _Underflow< char, char_traits >; williamr@2: williamr@2: template williamr@2: class basic_filebuf : public basic_streambuf<_CharT, _Traits> williamr@2: { williamr@2: public: // Types. williamr@2: typedef _CharT char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: typedef typename _Traits::state_type _State_type; williamr@2: typedef basic_streambuf<_CharT, _Traits> _Base; williamr@2: typedef basic_filebuf<_CharT, _Traits> _Self; williamr@2: williamr@2: public: // Constructors, destructor. williamr@2: basic_filebuf(); williamr@2: ~basic_filebuf(); williamr@2: williamr@2: public: // Opening and closing files. williamr@2: bool is_open() const { return _M_base.__is_open(); } williamr@2: williamr@2: _Self* open(const char* __s, ios_base::openmode __m) { williamr@2: return _M_base._M_open(__s, __m) ? this : 0; williamr@2: } williamr@2: williamr@2: # ifndef _STLP_NO_EXTENSIONS williamr@2: // These two version of open() and file descriptor getter are extensions. williamr@2: _Self* open(const char* __s, ios_base::openmode __m, williamr@2: long __protection) { williamr@2: return _M_base._M_open(__s, __m, __protection) ? this : 0; williamr@2: } williamr@2: williamr@2: _STLP_fd fd() const { return _M_base.__get_fd(); } williamr@2: williamr@2: _Self* open(int __id, ios_base::openmode _Init_mode = ios_base::__default_mode) { williamr@2: return this->_M_open(__id, _Init_mode); williamr@2: } williamr@2: # endif williamr@2: williamr@2: _Self* _M_open(int __id, ios_base::openmode _Init_mode = ios_base::__default_mode) { williamr@2: return _M_base._M_open(__id, _Init_mode) ? this : 0; williamr@2: } williamr@2: williamr@2: _Self* close(); williamr@2: williamr@2: protected: // Virtual functions from basic_streambuf. williamr@2: virtual streamsize showmanyc(); williamr@2: virtual int_type underflow(); williamr@2: williamr@2: virtual int_type pbackfail(int_type = traits_type::eof()); williamr@2: virtual int_type overflow(int_type = traits_type::eof()); williamr@2: williamr@2: virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize); williamr@2: virtual pos_type seekoff(off_type, ios_base::seekdir, williamr@2: ios_base::openmode = ios_base::in | ios_base::out); williamr@2: virtual pos_type seekpos(pos_type, williamr@2: ios_base::openmode = ios_base::in | ios_base::out); williamr@2: williamr@2: virtual int sync(); williamr@2: virtual void imbue(const locale&); williamr@2: williamr@2: #ifdef __SYMBIAN32__ williamr@2: virtual int save_read_buffer (); williamr@2: virtual void _change_input_mode(); williamr@2: #endif williamr@2: williamr@2: private: // Helper functions. williamr@2: williamr@2: // Precondition: we are currently in putback input mode. Effect: williamr@2: // switches back to ordinary input mode. williamr@2: void _M_exit_putback_mode() { williamr@2: this->setg(_M_saved_eback, _M_saved_gptr, _M_saved_egptr); williamr@2: _M_in_putback_mode = false; williamr@2: } williamr@2: bool _M_switch_to_input_mode(); williamr@2: void _M_exit_input_mode(); williamr@2: bool _M_switch_to_output_mode(); williamr@2: williamr@2: int_type _M_input_error(); williamr@2: int_type _M_underflow_aux(); williamr@2: // friend class _Noconv_input<_Traits>; williamr@2: // friend class _Noconv_output<_Traits>; williamr@2: friend class _Underflow<_CharT, _Traits>; williamr@2: williamr@2: int_type _M_output_error(); williamr@2: bool _M_unshift(); williamr@2: williamr@2: bool _M_allocate_buffers(_CharT* __buf, streamsize __n); williamr@2: bool _M_allocate_buffers(); williamr@2: void _M_deallocate_buffers(); williamr@2: williamr@2: pos_type _M_seek_return(off_type __off, _State_type __state) { williamr@2: if (__off != -1) { williamr@2: if (_M_in_input_mode) williamr@2: _M_exit_input_mode(); williamr@2: #ifndef __SYMBIAN32__ williamr@2: _M_in_input_mode = false; //moved down, because setg again sets input mode williamr@2: #endif williamr@2: _M_in_output_mode = false; williamr@2: _M_in_putback_mode = false; williamr@2: _M_in_error_mode = false; williamr@2: this->setg(0, 0, 0); williamr@2: this->setp(0, 0); williamr@2: #ifdef __SYMBIAN32__ williamr@2: _M_in_input_mode = false; williamr@2: #endif williamr@2: } williamr@2: williamr@2: pos_type __result(__off); williamr@2: __result.state(__state); williamr@2: return __result; williamr@2: } williamr@2: williamr@2: bool _M_seek_init(bool __do_unshift); williamr@2: williamr@2: void _M_setup_codecvt(const locale&); williamr@2: williamr@2: private: // Data members used in all modes. williamr@2: williamr@2: _Filebuf_base _M_base; williamr@2: williamr@2: private: // Locale-related information. williamr@2: williamr@2: unsigned char _M_constant_width; williamr@2: unsigned char _M_always_noconv; williamr@2: williamr@2: // private: // Mode flags. williamr@2: unsigned char _M_int_buf_dynamic; // True if internal buffer is heap allocated, williamr@2: // false if it was supplied by the user. williamr@2: unsigned char _M_in_input_mode; williamr@2: unsigned char _M_in_output_mode; williamr@2: unsigned char _M_in_error_mode; williamr@2: unsigned char _M_in_putback_mode; williamr@2: williamr@2: // Internal buffer: characters seen by the filebuf's clients. williamr@2: _CharT* _M_int_buf; williamr@2: _CharT* _M_int_buf_EOS; williamr@2: williamr@2: // External buffer: characters corresponding to the external file. williamr@2: char* _M_ext_buf; williamr@2: char* _M_ext_buf_EOS; williamr@2: williamr@2: // The range [_M_ext_buf, _M_ext_buf_converted) contains the external williamr@2: // characters corresponding to the sequence in the internal buffer. The williamr@2: // range [_M_ext_buf_converted, _M_ext_buf_end) contains characters that williamr@2: // have been read into the external buffer but have not been converted williamr@2: // to an internal sequence. williamr@2: char* _M_ext_buf_converted; williamr@2: char* _M_ext_buf_end; williamr@2: williamr@2: // State corresponding to beginning of internal buffer. williamr@2: _State_type _M_state; williamr@2: williamr@2: private: // Data members used only in input mode. williamr@2: williamr@2: // Similar to _M_state except that it corresponds to williamr@2: // the end of the internal buffer instead of the beginning. williamr@2: _State_type _M_end_state; williamr@2: williamr@2: // This is a null pointer unless we are in mmap input mode. williamr@2: void* _M_mmap_base; williamr@2: streamoff _M_mmap_len; williamr@2: williamr@2: private: // Data members used only in putback mode. williamr@2: _CharT* _M_saved_eback; williamr@2: _CharT* _M_saved_gptr; williamr@2: _CharT* _M_saved_egptr; williamr@2: williamr@2: typedef codecvt<_CharT, char, _State_type> _Codecvt; williamr@2: const _Codecvt* _M_codecvt; williamr@2: williamr@2: int _M_width; // Width of the encoding (if constant), else 1 williamr@2: int _M_max_width; // Largest possible width of single character. williamr@2: williamr@2: williamr@2: enum { _S_pback_buf_size = 8 }; williamr@2: _CharT _M_pback_buf[_S_pback_buf_size]; williamr@2: williamr@2: // for _Noconv_output williamr@2: public: williamr@2: bool _M_write(char* __buf, ptrdiff_t __n) {return _M_base._M_write(__buf, __n); } williamr@2: williamr@2: public: williamr@2: int_type williamr@2: _M_do_noconv_input() { williamr@2: _M_ext_buf_converted = _M_ext_buf_end; williamr@2: this->setg((char_type*)_M_ext_buf, (char_type*)_M_ext_buf, (char_type*)_M_ext_buf_end); williamr@2: return traits_type::to_int_type(*_M_ext_buf); williamr@2: } williamr@2: }; williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_filebuf >; williamr@2: # if ! defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_filebuf >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: // public: williamr@2: // helper class. williamr@2: template williamr@2: struct _Filebuf_Tmp_Buf williamr@2: { williamr@2: _CharT* _M_ptr; williamr@2: _Filebuf_Tmp_Buf(ptrdiff_t __n) : _M_ptr(0) { _M_ptr = new _CharT[__n]; } williamr@2: ~_Filebuf_Tmp_Buf() { delete[] _M_ptr; } williamr@2: }; williamr@2: williamr@2: williamr@2: // williamr@2: // This class had to be designed very carefully to work williamr@2: // with Visual C++. williamr@2: // williamr@2: template williamr@2: class _Noconv_output { williamr@2: public: williamr@2: typedef typename _Traits::char_type char_type; williamr@2: static bool _STLP_CALL _M_doit(basic_filebuf*, williamr@2: char_type*, char_type*) williamr@2: { williamr@2: return false; williamr@2: } williamr@2: }; williamr@2: williamr@2: _STLP_TEMPLATE_NULL williamr@2: class _STLP_CLASS_DECLSPEC _Noconv_output< char_traits > { williamr@2: public: williamr@2: static bool _STLP_CALL williamr@2: _M_doit(basic_filebuf >* __buf, williamr@2: char* __first, char* __last) williamr@2: { williamr@2: ptrdiff_t __n = __last - __first; williamr@2: if (__buf->_M_write(__first, __n)) { williamr@2: return true; williamr@2: } williamr@2: else williamr@2: return false; williamr@2: } williamr@2: }; williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // basic_filebuf<> helper functions. williamr@2: williamr@2: williamr@2: //---------------------------------------- williamr@2: // Helper functions for switching between modes. williamr@2: williamr@2: // williamr@2: // This class had to be designed very carefully to work williamr@2: // with Visual C++. williamr@2: // williamr@2: template williamr@2: class _Noconv_input { williamr@2: public: williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::char_type char_type; williamr@2: williamr@2: static inline int_type _STLP_CALL williamr@2: _M_doit(basic_filebuf*) williamr@2: { williamr@2: return 0; williamr@2: } williamr@2: }; williamr@2: williamr@2: _STLP_TEMPLATE_NULL williamr@2: class _Noconv_input > { williamr@2: public: williamr@2: static inline int _STLP_CALL williamr@2: _M_doit(basic_filebuf >* __buf) { williamr@2: return __buf->_M_do_noconv_input(); williamr@2: } williamr@2: }; williamr@2: williamr@2: // underflow() may be called for one of two reasons. (1) We've williamr@2: // been going through the special putback buffer, and we need to move back williamr@2: // to the regular internal buffer. (2) We've exhausted the internal buffer, williamr@2: // and we need to replentish it. williamr@2: template williamr@2: class _Underflow { williamr@2: public: williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: static int_type _STLP_CALL _M_doit(basic_filebuf<_CharT, _Traits>* __this); williamr@2: }; williamr@2: williamr@2: williamr@2: // Specialization of underflow: if the character type is char, maybe williamr@2: // we can use mmap instead of read. williamr@2: _STLP_TEMPLATE_NULL williamr@2: class _STLP_CLASS_DECLSPEC _Underflow< char, char_traits > { williamr@2: public: williamr@2: typedef char_traits::int_type int_type; williamr@2: typedef char_traits traits_type; williamr@2: _STLP_DECLSPEC static int _STLP_CALL _M_doit(basic_filebuf* __this); williamr@2: }; williamr@2: williamr@2: // There is a specialized version of underflow, for basic_filebuf, williamr@2: // in fstream.cxx. williamr@2: williamr@2: template williamr@2: _STLP_TYPENAME_ON_RETURN_TYPE _Underflow<_CharT, _Traits>::int_type // _STLP_CALL williamr@2: _Underflow<_CharT, _Traits>::_M_doit(basic_filebuf<_CharT, _Traits>* __this) williamr@2: { williamr@2: if (!__this->_M_in_input_mode) { williamr@2: if (!__this->_M_switch_to_input_mode()) williamr@2: return traits_type::eof(); williamr@2: } williamr@2: williamr@2: else if (__this->_M_in_putback_mode) { williamr@2: __this->_M_exit_putback_mode(); williamr@2: if (__this->gptr() != __this->egptr()) { williamr@2: int_type __c = traits_type::to_int_type(*__this->gptr()); williamr@2: return __c; williamr@2: } williamr@2: } williamr@2: williamr@2: return __this->_M_underflow_aux(); williamr@2: } williamr@2: williamr@2: #if defined( _STLP_USE_TEMPLATE_EXPORT ) && ! defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS _Underflow >; williamr@2: #endif williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class basic_ifstream<> williamr@2: williamr@2: template williamr@2: class basic_ifstream : public basic_istream<_CharT, _Traits> williamr@2: { williamr@2: public: // Types williamr@2: typedef _CharT char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: typedef basic_ios<_CharT, _Traits> _Basic_ios; williamr@2: typedef basic_istream<_CharT, _Traits> _Base; williamr@2: typedef basic_filebuf<_CharT, _Traits> _Buf; williamr@2: williamr@2: public: // Constructors, destructor. williamr@2: williamr@2: basic_ifstream() : williamr@2: basic_ios<_CharT, _Traits>(), basic_istream<_CharT, _Traits>(0), _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: } williamr@2: williamr@2: explicit basic_ifstream(const char* __s, ios_base::openmode __mod = ios_base::in) : williamr@2: basic_ios<_CharT, _Traits>(), basic_istream<_CharT, _Traits>(0), williamr@2: _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__s, __mod | ios_base::in)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: # ifndef _STLP_NO_EXTENSIONS williamr@2: explicit basic_ifstream(int __id, ios_base::openmode __mod = ios_base::in) : williamr@2: basic_ios<_CharT, _Traits>(), basic_istream<_CharT, _Traits>(0), _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__id, __mod | ios_base::in)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: basic_ifstream(const char* __s, ios_base::openmode __m, williamr@2: long __protection) : williamr@2: basic_ios<_CharT, _Traits>(), basic_istream<_CharT, _Traits>(0), _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__s, __m | ios_base::in, __protection)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: # endif williamr@2: williamr@2: ~basic_ifstream() {} williamr@2: williamr@2: public: // File and buffer operations. williamr@2: basic_filebuf<_CharT, _Traits>* rdbuf() const williamr@2: { return __CONST_CAST(_Buf*,&_M_buf); } williamr@2: williamr@2: bool is_open() { williamr@2: return this->rdbuf()->is_open(); williamr@2: } williamr@2: williamr@2: void open(const char* __s, ios_base::openmode __mod = ios_base::in) { williamr@2: if (!this->rdbuf()->open(__s, __mod | ios_base::in)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: void close() { williamr@2: if (!this->rdbuf()->close()) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: williamr@2: private: williamr@2: basic_filebuf<_CharT, _Traits> _M_buf; williamr@2: }; williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class basic_ofstream<> williamr@2: williamr@2: template williamr@2: class basic_ofstream : public basic_ostream<_CharT, _Traits> williamr@2: { williamr@2: public: // Types williamr@2: typedef _CharT char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: typedef basic_ios<_CharT, _Traits> _Basic_ios; williamr@2: typedef basic_ostream<_CharT, _Traits> _Base; williamr@2: typedef basic_filebuf<_CharT, _Traits> _Buf; williamr@2: williamr@2: public: // Constructors, destructor. williamr@2: basic_ofstream() : williamr@2: basic_ios<_CharT, _Traits>(), williamr@2: basic_ostream<_CharT, _Traits>(0), _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: } williamr@2: explicit basic_ofstream(const char* __s, ios_base::openmode __mod = ios_base::out) williamr@2: : basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0), williamr@2: _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__s, __mod | ios_base::out)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: # ifndef _STLP_NO_EXTENSIONS williamr@2: explicit basic_ofstream(int __id, ios_base::openmode __mod = ios_base::out) williamr@2: : basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0), williamr@2: _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__id, __mod | ios_base::out)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: basic_ofstream(const char* __s, ios_base::openmode __m, long __protection) : williamr@2: basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0), _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__s, __m | ios_base::out, __protection)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: # endif williamr@2: williamr@2: ~basic_ofstream() {} williamr@2: williamr@2: public: // File and buffer operations. williamr@2: basic_filebuf<_CharT, _Traits>* rdbuf() const williamr@2: { return __CONST_CAST(_Buf*,&_M_buf); } williamr@2: williamr@2: bool is_open() { williamr@2: return this->rdbuf()->is_open(); williamr@2: } williamr@2: williamr@2: void open(const char* __s, ios_base::openmode __mod= ios_base::out) { williamr@2: if (!this->rdbuf()->open(__s, __mod | ios_base::out)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: void close() { williamr@2: if (!this->rdbuf()->close()) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: private: williamr@2: basic_filebuf<_CharT, _Traits> _M_buf; williamr@2: }; williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class basic_fstream<> williamr@2: williamr@2: template williamr@2: class basic_fstream : public basic_iostream<_CharT, _Traits> williamr@2: { williamr@2: public: // Types williamr@2: typedef _CharT char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: typedef basic_ios<_CharT, _Traits> _Basic_ios; williamr@2: typedef basic_iostream<_CharT, _Traits> _Base; williamr@2: typedef basic_filebuf<_CharT, _Traits> _Buf; williamr@2: williamr@2: public: // Constructors, destructor. williamr@2: williamr@2: _STLP_DECLSPEC basic_fstream(); williamr@2: explicit basic_fstream(const char* __s, williamr@2: ios_base::openmode __mod = ios_base::in | ios_base::out) : williamr@2: basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__s, __mod)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: # ifndef _STLP_NO_EXTENSIONS williamr@2: explicit basic_fstream(int __id, williamr@2: ios_base::openmode __mod = ios_base::in | ios_base::out) : williamr@2: basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__id, __mod)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: basic_fstream(const char* __s, ios_base::openmode __m, long __protection) : williamr@2: basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() { williamr@2: this->init(&_M_buf); williamr@2: if (!_M_buf.open(__s, __m, __protection)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: # endif williamr@2: _STLP_DECLSPEC ~basic_fstream(); williamr@2: williamr@2: public: // File and buffer operations. williamr@2: williamr@2: basic_filebuf<_CharT, _Traits>* rdbuf() const williamr@2: { return __CONST_CAST(_Buf*,&_M_buf); } williamr@2: williamr@2: bool is_open() { williamr@2: return this->rdbuf()->is_open(); williamr@2: } williamr@2: williamr@2: void open(const char* __s, williamr@2: ios_base::openmode __mod = williamr@2: ios_base::in | ios_base::out) { williamr@2: if (!this->rdbuf()->open(__s, __mod)) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: void close() { williamr@2: if (!this->rdbuf()->close()) williamr@2: this->setstate(ios_base::failbit); williamr@2: } williamr@2: williamr@2: private: williamr@2: basic_filebuf<_CharT, _Traits> _M_buf; williamr@2: }; williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: # if !defined (_STLP_LINK_TIME_INSTANTIATION) williamr@2: # include williamr@2: # endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_ifstream >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_ofstream >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_fstream >; williamr@2: # if ! defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_ifstream >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_ofstream >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_fstream >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #endif /* _STLP_FSTREAM */ williamr@2: williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: