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 + -
显示快捷键?