fstream.tcc

来自「ARM Linux Tool 各种代码包括MTD」· TCC 代码 · 共 606 行 · 第 1/2 页

TCC
606
字号
// File based streams -*- C++ -*-// Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.//// 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// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING.  If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.// As a special exception, you may use this file as part of a free software// library without restriction.  Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License.  This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License.//// ISO C++ 14882: 27.8  File-based streams//#ifndef _CPP_BITS_FSTREAM_TCC#define _CPP_BITS_FSTREAM_TCC 1namespace std{  template<typename _CharT, typename _Traits>    void    basic_filebuf<_CharT, _Traits>::    _M_allocate_file()    {      if (!_M_file)	{	  _M_buf_unified = true; // Tie input to output for basic_filebuf.	  try 	    { _M_file = new __file_type(&_M_lock); }	  catch(...) 	    {	      delete _M_file;	      __throw_exception_again;	    }	}    }  template<typename _CharT, typename _Traits>    void    basic_filebuf<_CharT, _Traits>::    _M_allocate_internal_buffer()    {      if (!_M_buf && _M_buf_size_opt)	{	  _M_buf_size = _M_buf_size_opt;	  // Allocate internal buffer.	  try { _M_buf = new char_type[_M_buf_size]; }	  catch(...) 	    {	      delete [] _M_buf;	      __throw_exception_again;	    }	  _M_buf_allocated = true;	}    }  // Both close and setbuf need to deallocate internal buffers, if it exists.  template<typename _CharT, typename _Traits>    void    basic_filebuf<_CharT, _Traits>::    _M_destroy_internal_buffer()    {      if (_M_buf_allocated)	{	  delete [] _M_buf;	  _M_buf = NULL;	  _M_buf_allocated = false;	  this->setg(NULL, NULL, NULL);	  this->setp(NULL, NULL);	}    } template<typename _CharT, typename _Traits>    void    basic_filebuf<_CharT, _Traits>::    _M_allocate_pback_buffer()    {      if (!_M_pback && _M_pback_size)	{	  // Allocate pback buffer.	  try 	    { _M_pback = new char_type[_M_pback_size]; }	  catch(...) 	    {	      delete [] _M_pback;	      __throw_exception_again;	    }	}    }  template<typename _CharT, typename _Traits>    basic_filebuf<_CharT, _Traits>::    basic_filebuf()     : __streambuf_type(), _M_file(NULL), _M_state_cur(__state_type()),     _M_state_beg(__state_type()), _M_buf_allocated(false),     _M_last_overflowed(false)    { }  template<typename _CharT, typename _Traits>    basic_filebuf<_CharT, _Traits>::    basic_filebuf(__c_file_type* __f, ios_base::openmode __mode, int_type __s)    : __streambuf_type(),  _M_file(NULL), _M_state_cur(__state_type()),     _M_state_beg(__state_type()), _M_buf_allocated(false),     _M_last_overflowed(false)    {      _M_allocate_file();      _M_file->sys_open(__f, __mode);      if (this->is_open())	{	  _M_mode = __mode;	  if (__s)	    {	      _M_buf_size_opt = __s;	      _M_allocate_internal_buffer();	      _M_set_indeterminate();	    }	  _M_allocate_pback_buffer();	}    }  template<typename _CharT, typename _Traits>    basic_filebuf<_CharT, _Traits>::__filebuf_type*     basic_filebuf<_CharT, _Traits>::    open(const char* __s, ios_base::openmode __mode)    {      __filebuf_type *__ret = NULL;      if (!this->is_open())	{	  _M_allocate_file();	  _M_file->open(__s, __mode);	  if (this->is_open())	    {	      _M_allocate_internal_buffer();	      _M_allocate_pback_buffer();	      _M_mode = __mode;	      	      // For time being, set both (in/out) sets  of pointers.	      _M_set_indeterminate();	      if (__mode & ios_base::ate		  && this->seekoff(0, ios_base::end, __mode) < 0)		this->close();	      __ret = this;	    }	}      return __ret;    }  template<typename _CharT, typename _Traits>    basic_filebuf<_CharT, _Traits>::__filebuf_type*     basic_filebuf<_CharT, _Traits>::    close()    {      __filebuf_type *__ret = NULL;      if (this->is_open())	{	  bool __testput = _M_out_cur && _M_out_beg < _M_out_end;	  if (__testput)	    _M_really_overflow(traits_type::eof());	  // NB: Do this here so that re-opened filebufs will be cool...	  _M_pback_destroy();#if 0	  // XXX not done	  if (_M_last_overflowed)	    {	      _M_output_unshift();	      _M_really_overflow(traits_type::eof());	    }#endif	  _M_mode = ios_base::openmode(0);	  _M_destroy_internal_buffer();	  if (_M_pback)	    {	      delete [] _M_pback;	      _M_pback = NULL;	    }	  __ret = this;	}      // Can actually allocate this file as part of an open and never      // have it be opened.....      if (_M_file)	{	  delete _M_file;	  _M_file = NULL;	}      _M_last_overflowed = false;	      return __ret;    }  template<typename _CharT, typename _Traits>    streamsize     basic_filebuf<_CharT, _Traits>::    showmanyc()    {      streamsize __ret = -1;      bool __testin = _M_mode & ios_base::in;      if (__testin)	{	  bool __testeof = false;	  if (_M_in_cur >= _M_in_end)	    __testeof = this->underflow() == traits_type::eof();	  if (!__testeof)	    __ret = _M_in_end - _M_in_cur;	}      _M_last_overflowed = false;	      return __ret;    }  template<typename _CharT, typename _Traits>    basic_filebuf<_CharT, _Traits>::int_type     basic_filebuf<_CharT, _Traits>::    underflow()    {      int_type __ret = traits_type::eof();      bool __testin = _M_mode & ios_base::in;      bool __testout = _M_mode & ios_base::out;      // XXX Should re-enable codecvt bits disabled after 2.90.8.      if (__testin)	{	  // Check for pback madness, and if so swich back to the	  // normal buffers and jet outta here before expensive	  // fileops happen...	  if (_M_pback_init)	    {	      _M_pback_destroy();	      if (_M_in_cur < _M_in_end)		return traits_type::to_int_type(*_M_in_cur);	    }	  bool __testget = _M_in_cur && _M_in_beg < _M_in_cur;	  bool __testinit = _M_is_indeterminate();	  // Sync internal and external buffers.	  // NB: __testget -> __testput as _M_buf_unified here.	  if (__testget)	    {	      if (__testout)		_M_really_overflow();#if _GLIBCPP_AVOID_FSEEK	      else if ((_M_in_cur - _M_in_beg) == 1)		_M_file->sys_getc();#endif	      else 		_M_file->seekoff(_M_in_cur - _M_in_beg, 				 ios_base::cur, ios_base::in);	    }	  if (__testinit || __testget)	    {	      // Assume buffered case, need to refill internal buffers.	      streamsize __size = _M_file->xsgetn(_M_in_beg, _M_buf_size);	      if (0 < __size)		{		  _M_set_determinate(__size);		  if (__testout)		    _M_out_cur = _M_in_cur;		  __ret = traits_type::to_int_type(*_M_in_cur);#if _GLIBCPP_AVOID_FSEEK		  if (__size == 1)		    _M_file->sys_ungetc(*_M_in_cur);		  else		    {#endif		  streamoff __p = _M_file->seekoff(0 - __size, ios_base::cur, 						   ios_base::in);		  if (__p == -1)		    {		      // XXX Something is wrong, do error checking.		    }#if _GLIBCPP_AVOID_FSEEK		    }#endif		}	   	    }	}      _M_last_overflowed = false;	      return __ret;    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?