diff options
author | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-11 04:20:57 +0000 |
---|---|---|
committer | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-11 04:20:57 +0000 |
commit | fd63f08b43f6e68bb45f8203b16f76de190c8c05 (patch) | |
tree | d71fba2b50f60c163b3ae4a43531c159bc10ec81 /libstdc++-v3/include/ext | |
parent | 081e528ab21446b3552b39d9fd9341b0ac6ec4e7 (diff) | |
download | gcc-fd63f08b43f6e68bb45f8203b16f76de190c8c05.tar.gz |
2003-05-10 Petur Runolfsson <peturr02@ru.is>
PR libstdc++/9027
PR libstdc++/9520
PR libstdc++/10096
* include/bits/fstream.tcc (basic_file::_M_underflow): Add generic
implementation, based on old wchar_t specialization, add support
for codecvt::in() return value of codecvt_base::noconv, remove
_M_file.sys_ungetc() call.
* include/std/std_fstream.h (basic_file::underflow,
basic_file::uflow, basic_file::_M_underflow): Remove
specialization declarations, call _M_underflow from generic versions
of underflow and uflow.
* src/fstream.cc (basic_file::underflow, basic_file::uflow,
basic_file::_M_underflow): Remove specializations.
* src/Makefile.am (sources): Remove fstream.cc.
* src/Makefile.in: Regenerated.
* testsuite/27_io/basic_filebuf/underflow/10096.cc: New test.
* testsuite/27_io/basic_filebuf/underflow/char/1.cc: New test.
* testsuite/27_io/basic_filebuf/underflow/char/9027.cc: New test.
* testsuite/27_io/basic_filebuf/underflow/wchar_t/9520.cc: New test.
2003-05-10 Benjamin Kosnik <bkoz@redhat.com>
* include/ext/stdio_filebuf.h (__stdio_filebuf): Remove stack
buffer.
* config/io/basic_file_stdio.h (__basic_file::xsgetn): Remove
unbuffered bits.
(__basic_file::xsputn): Same.
(__basic_file::seekoff): Same.
(__basic_file::seekpos): Same.
(__basic_file::showmanyc): Same.
* config/io/basic_file_stdio.cc: Same.
* include/std/std_fstream.h: Same.
* include/bits/fstream.tcc: Same.
* src/fstream.cc: Same.
* testsuite/27_io/basic_filebuf/sgetn/char/1.cc (test05): Tidy.
2003-05-10 Petur Runolfsson <peturr02@ru.is>
PR libstdc++/9520
PR libstdc++/9661
PR libstdc++/9662
* include/ext/stdio_sync_filebuf.h: New file.
(basic_stdiobuf): New.
* include/Makefile.am (ext_headers): Add ext/stdio_sync_filebuf.h
* include/Makefile.in: Regenerate.
* include/bits/ios_base.h (Init::_S_create_buffers,
Init::_S_destroy_buffers): Remove declarations.
* src/globals.cc (buf_cout_sync, buf_cin_sync, buf_cerr_sync,
buf_wcout_sync, buf_wcin_sync, buf_wcerr_sync): Define.
* src/ios.cc (Init::_S_create_buffers,
Init::_S_destroy_buffers): Remove.
(Init::Init): Create and use syncronized buffers.
(ios_base::sync_with_stdio): Destroy syncronized buffers,
create and install unsyncronized buffers.
* testsuite/27_io/objects/char/10.cc: New test.
* testsuite/27_io/objects/char/9.cc: New test.
* testsuite/27_io/objects/char/9661-1.cc: New test.
* testsuite/27_io/objects/char/9661-2_xin.cc: New test.
* testsuite/27_io/objects/char/9661-2_xin.in: New.
* testsuite/27_io/objects/wchar_t/1.cc: New test.
* testsuite/27_io/objects/wchar_t/10.cc: New test.
* testsuite/27_io/objects/wchar_t/2.cc: New test.
* testsuite/27_io/objects/wchar_t/2523-1_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/2523-1_xin.in: New.
* testsuite/27_io/objects/wchar_t/2523-2_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/2523-2_xin.in: New.
* testsuite/27_io/objects/wchar_t/3045.cc: New test.
* testsuite/27_io/objects/wchar_t/3647.cc: New test.
* testsuite/27_io/objects/wchar_t/3_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/3_xin.in: New.
* testsuite/27_io/objects/wchar_t/4_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/4_xin.in: New.
* testsuite/27_io/objects/wchar_t/5.cc: New test.
* testsuite/27_io/objects/wchar_t/5268.cc: New test.
* testsuite/27_io/objects/wchar_t/5280_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/5280_xin.in: New.
* testsuite/27_io/objects/wchar_t/6.cc: New test.
* testsuite/27_io/objects/wchar_t/6548_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/6548_xin.in: New.
* testsuite/27_io/objects/wchar_t/6648-1_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/6648-1_xin.in: New.
* testsuite/27_io/objects/wchar_t/6648-2_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/6648-2_xin.in: New.
* testsuite/27_io/objects/wchar_t/7.cc: New test.
* testsuite/27_io/objects/wchar_t/7744_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/7744_xin.in: New.
* testsuite/27_io/objects/wchar_t/8.cc: New test.
* testsuite/27_io/objects/wchar_t/9_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/9_xin.in: New.
* testsuite/27_io/objects/wchar_t/9520.cc: New test.
* testsuite/27_io/objects/wchar_t/9661-1.cc: New test.
* testsuite/27_io/objects/wchar_t/9661-2_xin.cc: New test.
* testsuite/27_io/objects/wchar_t/9661-2_xin.in: New.
* testsuite/27_io/objects/wchar_t/9662.cc: New test.
* testsuite/ext/stdiobuf_char.cc: New test.
* testsuite/ext/stdiobuf_wchar_t.cc: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66678 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/ext')
-rw-r--r-- | libstdc++-v3/include/ext/stdio_filebuf.h | 19 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/stdio_sync_filebuf.h | 247 |
2 files changed, 251 insertions, 15 deletions
diff --git a/libstdc++-v3/include/ext/stdio_filebuf.h b/libstdc++-v3/include/ext/stdio_filebuf.h index 90031963631..4d3c9d07eee 100644 --- a/libstdc++-v3/include/ext/stdio_filebuf.h +++ b/libstdc++-v3/include/ext/stdio_filebuf.h @@ -35,6 +35,7 @@ #define _EXT_STDIO_FILEBUF #pragma GCC system_header + #include <fstream> namespace __gnu_cxx @@ -60,10 +61,6 @@ namespace __gnu_cxx typedef typename traits_type::off_type off_type; typedef std::size_t size_t; - protected: - // Stack-based buffer for unbuffered input. - char_type _M_unbuf[4]; - public: /** * @param fd An open file descriptor. @@ -125,11 +122,7 @@ namespace __gnu_cxx { this->_M_mode = __mode; this->_M_buf_size = __size; - if (__size > 0 && __size < 4) - // Specify not to use an allocated buffer. - this->_M_buf = _M_unbuf; - else - _M_allocate_internal_buffer(); + _M_allocate_internal_buffer(); _M_set_indeterminate(); } } @@ -144,14 +137,10 @@ namespace __gnu_cxx { this->_M_mode = __mode; this->_M_buf_size = __size; - if (__size > 0 && __size < 4) - // Specify not to use an allocated buffer. - this->_M_buf = _M_unbuf; - else - _M_allocate_internal_buffer(); + _M_allocate_internal_buffer(); _M_set_indeterminate(); } } } // namespace __gnu_cxx -#endif /* _EXT_STDIO_FILEBUF */ +#endif diff --git a/libstdc++-v3/include/ext/stdio_sync_filebuf.h b/libstdc++-v3/include/ext/stdio_sync_filebuf.h new file mode 100644 index 00000000000..5e110c4fd20 --- /dev/null +++ b/libstdc++-v3/include/ext/stdio_sync_filebuf.h @@ -0,0 +1,247 @@ +// Iostreams wrapper for stdio FILE* -*- C++ -*- + +// Copyright (C) 2003 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. + +/** @file ext/stdiostream.h + * This file is a GNU extension to the Standard C++ Library. + */ + +#ifndef _EXT_STDIO_SYNC_FILEBUF +#define _EXT_STDIO_SYNC_FILEBUF + +#pragma GCC system_header + +#include <fstream> +#include <unistd.h> + +#if defined(_GLIBCPP_HAVE_S_ISREG) || defined(_GLIBCPP_HAVE_S_IFREG) +# include <sys/stat.h> +# ifdef _GLIBCPP_HAVE_S_ISREG +# define _GLIBCPP_ISREG(x) S_ISREG(x) +# else +# define _GLIBCPP_ISREG(x) (((x) & S_IFMT) == S_IFREG) +# endif +#endif + +#ifdef _GLIBCPP_USE_WCHAR_T +#include <cwchar> +#endif + +namespace __gnu_cxx +{ + template<typename _CharT, typename _Traits = std::char_traits<_CharT> > + class stdio_sync_filebuf : public std::basic_streambuf<_CharT, _Traits> + { + private: + std::__c_file* const _M_file; + + public: + // Types: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + explicit + stdio_sync_filebuf(std::__c_file* __f) : _M_file(__f) { } + + protected: + + int_type + syncgetc(); + + int_type + syncungetc(int_type __c); + + int_type + syncputc(int_type __c); + + virtual int_type + underflow() + { + int_type __c = this->syncgetc(); + return this->syncungetc(__c); + } + + virtual int_type + uflow() + { return this->syncgetc(); } + + virtual int_type + pbackfail(int_type __c = traits_type::eof()) + { return this->syncungetc(__c); } + + virtual std::streamsize + xsgetn(char_type* __s, std::streamsize __n); + + virtual std::streamsize + showmanyc() + { +#if defined(_GLIBCPP_HAVE_S_ISREG) || defined(_GLIBCPP_HAVE_S_IFREG) + // Regular files. + struct stat __buffer; + int __ret = fstat(fileno(_M_file), &__buffer); + if (!__ret && _GLIBCPP_ISREG(__buffer.st_mode)) + return __buffer.st_size - ftell(_M_file); +#endif + return 0; + } + + virtual int_type + overflow(int_type __c = traits_type::eof()) + { + int_type __ret; + if (traits_type::eq_int_type(__c, traits_type::eof())) + { + if (std::fflush(_M_file)) + __ret = traits_type::eof(); + else + __ret = traits_type::not_eof(__c); + } + else + __ret = this->syncputc(__c); + return __ret; + } + + virtual std::streamsize + xsputn(const char_type* __s, std::streamsize __n); + + virtual int + sync() + { return std::fflush(_M_file); } + + virtual std::streampos + seekoff(std::streamoff __off, std::ios_base::seekdir __dir, + std::ios_base::openmode = std::ios_base::in | std::ios_base::out) + { + std::streampos __ret(std::streamoff(-1)); + int __whence; + if (__dir == std::ios_base::beg) + __whence = SEEK_SET; + else if (__dir == std::ios_base::cur) + __whence = SEEK_CUR; + else + __whence = SEEK_END; + + if (!fseek(_M_file, __off, __whence)) + __ret = std::streampos(std::ftell(_M_file)); + return __ret; + } + + virtual std::streampos + seekpos(std::streampos __pos, + std::ios_base::openmode __mode = + std::ios_base::in | std::ios_base::out) + { return seekoff(std::streamoff(__pos), std::ios_base::beg, __mode); } + }; + + template<> + inline stdio_sync_filebuf<char>::int_type + stdio_sync_filebuf<char>::syncgetc() + { return std::getc(_M_file); } + + template<> + inline stdio_sync_filebuf<char>::int_type + stdio_sync_filebuf<char>::syncungetc(int_type __c) + { return std::ungetc(__c, _M_file); } + + template<> + inline stdio_sync_filebuf<char>::int_type + stdio_sync_filebuf<char>::syncputc(int_type __c) + { return std::putc(__c, _M_file); } + + template<> + inline std::streamsize + stdio_sync_filebuf<char>::xsgetn(char* __s, std::streamsize __n) + { return std::fread(__s, 1, __n, _M_file); } + + template<> + inline std::streamsize + stdio_sync_filebuf<char>::xsputn(const char* __s, std::streamsize __n) + { return std::fwrite(__s, 1, __n, _M_file); } + +#ifdef _GLIBCPP_USE_WCHAR_T + template<> + inline stdio_sync_filebuf<wchar_t>::int_type + stdio_sync_filebuf<wchar_t>::syncgetc() + { return std::getwc(_M_file); } + + template<> + inline stdio_sync_filebuf<wchar_t>::int_type + stdio_sync_filebuf<wchar_t>::syncungetc(int_type __c) + { return std::ungetwc(__c, _M_file); } + + template<> + inline stdio_sync_filebuf<wchar_t>::int_type + stdio_sync_filebuf<wchar_t>::syncputc(int_type __c) + { return std::putwc(__c, _M_file); } + + template<> + inline std::streamsize + stdio_sync_filebuf<wchar_t>::xsgetn(wchar_t* __s, std::streamsize __n) + { + std::streamsize __ret = 0; + const int_type __eof = traits_type::eof(); + while (__n--) + { + int_type __c = this->syncgetc(); + if (traits_type::eq_int_type(__c, __eof)) + break; + *__s++ = __c; + ++__ret; + } + return __ret; + } + + template<> + inline std::streamsize + stdio_sync_filebuf<wchar_t>::xsputn(const wchar_t* __s, + std::streamsize __n) + { + std::streamsize __ret = 0; + const int_type __eof = traits_type::eof(); + while (__n--) + { + if (traits_type::eq_int_type(this->syncputc(*__s++), __eof)) + break; + ++__ret; + } + return __ret; + } +#endif + +#if _GLIBCPP_EXTERN_TEMPLATE + extern template class stdio_sync_filebuf<char>; +#ifdef _GLIBCPP_USE_WCHAR_T + extern template class stdio_sync_filebuf<wchar_t>; +#endif +#endif +} // namespace __gnu_cxx + +#endif |