1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc. 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk. 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies. 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted, 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice. 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stlport_prefix.h" 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_USE_UNIX_IO 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include "details/fstream_unistd.cpp" 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#elif defined(_STLP_USE_STDIO_IO) 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include "details/fstream_stdio.cpp" 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#elif defined(_STLP_USE_WIN32_IO) 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include "details/fstream_win32io.cpp" 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# error "Can't recognize IO scheme to use" 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// fbp : let us map 1 MB maximum, just be sure not to trash VM 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define MMAP_CHUNK 0x100000L 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Underflow< char, char_traits<char> >::int_type _STLP_CALL 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Underflow< char, char_traits<char> >::_M_doit(basic_filebuf<char, char_traits<char> >* __this) 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef char_traits<char> traits_type; 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef traits_type::int_type int_type; 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__this->_M_in_input_mode) { 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__this->_M_switch_to_input_mode()) 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return traits_type::eof(); 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else if (__this->_M_in_putback_mode) { 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __this->_M_exit_putback_mode(); 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__this->gptr() != __this->egptr()) { 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int_type __c = traits_type::to_int_type(*__this->gptr()); 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return __c; 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // If it's a disk file, and if the internal and external character 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // sequences are guaranteed to be identical, then try to use memory 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // mapped I/O. Otherwise, revert to ordinary read. 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__this->_M_base.__regular_file() 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott && __this->_M_always_noconv 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott && __this->_M_base._M_in_binary_mode()) { 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // If we've mmapped part of the file already, then unmap it. 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__this->_M_mmap_base) 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __this->_M_base._M_unmap(__this->_M_mmap_base, __this->_M_mmap_len); 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Determine the position where we start mapping. It has to be 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // a multiple of the page size. 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff __cur = __this->_M_base._M_seek(0, ios_base::cur); 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff __size = __this->_M_base._M_file_size(); 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__size > 0 && __cur >= 0 && __cur < __size) { 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff __offset = (__cur / __this->_M_base.__page_size()) * __this->_M_base.__page_size(); 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff __remainder = __cur - __offset; 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __this->_M_mmap_len = __size - __offset; 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__this->_M_mmap_len > MMAP_CHUNK) 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __this->_M_mmap_len = MMAP_CHUNK; 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ((__this->_M_mmap_base = __this->_M_base._M_mmap(__offset, __this->_M_mmap_len)) != 0) { 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __this->setg(__STATIC_CAST(char*, __this->_M_mmap_base), 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __STATIC_CAST(char*, __this->_M_mmap_base) + __STATIC_CAST(ptrdiff_t, __remainder), 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __STATIC_CAST(char*, __this->_M_mmap_base) + __STATIC_CAST(ptrdiff_t, __this->_M_mmap_len)); 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return traits_type::to_int_type(*__this->gptr()); 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __this->_M_mmap_len = 0; 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __this->_M_mmap_base = 0; 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __this->_M_mmap_len = 0; 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return __this->_M_underflow_aux(); 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//---------------------------------------------------------------------- 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Force instantiation of filebuf and fstream classes. 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined(_STLP_NO_FORCE_INSTANTIATE) 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class basic_filebuf<char, char_traits<char> >; 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class basic_ifstream<char, char_traits<char> >; 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class basic_ofstream<char, char_traits<char> >; 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class basic_fstream<char, char_traits<char> >; 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (_STLP_NO_WCHAR_T) 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class _Underflow<wchar_t, char_traits<wchar_t> >; 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class basic_filebuf<wchar_t, char_traits<wchar_t> >; 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class basic_ifstream<wchar_t, char_traits<wchar_t> >; 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class basic_ofstream<wchar_t, char_traits<wchar_t> >; 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class basic_fstream<wchar_t, char_traits<wchar_t> >; 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif /* _STLP_NO_WCHAR_T */ 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE 115