[multiple changes]

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.

From-SVN: r66678
This commit is contained in:
Benjamin Kosnik 2003-05-11 04:20:57 +00:00
parent 6e5d72baac
commit 51ff814940
63 changed files with 2586 additions and 436 deletions

View File

@ -1,3 +1,102 @@
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.
2003-05-10 Paolo Carlini <pcarlini@unitus.it>
* testsuite/27_io/basic_filebuf/close/char/3.cc: Remove

View File

@ -205,77 +205,41 @@ namespace std
return __retval;
}
// In the next four functions we want to use stdio functions only
// when synced with stdio (_M_buf_size == 1): I/O primitives do not
// block until the asked number of bytes are available.
streamsize
__basic_file<char>::xsgetn(char* __s, streamsize __n, bool __stdio)
__basic_file<char>::xsgetn(char* __s, streamsize __n)
{
if (__stdio)
return fread(__s, 1, __n, _M_cfile);
else
{
streamsize __ret;
do
__ret = read(this->fd(), __s, __n);
while (__ret == -1L && errno == EINTR);
return __ret;
}
streamsize __ret;
do
__ret = read(this->fd(), __s, __n);
while (__ret == -1L && errno == EINTR);
return __ret;
}
streamsize
__basic_file<char>::xsputn(const char* __s, streamsize __n, bool __stdio)
__basic_file<char>::xsputn(const char* __s, streamsize __n)
{
if (__stdio)
return fwrite(__s, 1, __n, _M_cfile);
else
{
streamsize __ret;
do
__ret = write(this->fd(), __s, __n);
while (__ret == -1L && errno == EINTR);
return __ret;
}
streamsize __ret;
do
__ret = write(this->fd(), __s, __n);
while (__ret == -1L && errno == EINTR);
return __ret;
}
streamoff
__basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way,
bool __stdio, ios_base::openmode /*__mode*/)
{
if (!__stdio)
return lseek(this->fd(), __off, __way);
else
{
if (!fseek(_M_cfile, __off, __way))
return ftell(_M_cfile);
else
// Fseek failed.
return -1L;
}
}
ios_base::openmode /*__mode*/)
{ return lseek(this->fd(), __off, __way); }
streamoff
__basic_file<char>::seekpos(streamoff __pos, bool __stdio,
ios_base::openmode /*__mode*/)
{
if (!__stdio)
return lseek(this->fd(), __pos, ios_base::beg);
else
{
if (!fseek(_M_cfile, __pos, ios_base::beg))
return ftell(_M_cfile);
else
// Fseek failed.
return -1L;
}
}
__basic_file<char>::seekpos(streamoff __pos, ios_base::openmode /*__mode*/)
{ return lseek(this->fd(), __pos, ios_base::beg); }
int
__basic_file<char>::sync()
{ return fflush(_M_cfile); }
streamsize
__basic_file<char>::showmanyc_helper(bool __stdio)
__basic_file<char>::showmanyc()
{
#ifdef FIONREAD
// Pipes and sockets.
@ -299,9 +263,6 @@ namespace std
struct stat __buffer;
int __ret = fstat(this->fd(), &__buffer);
if (!__ret && _GLIBCPP_ISREG(__buffer.st_mode))
if (__stdio)
return __buffer.st_size - ftell(_M_cfile);
else
return __buffer.st_size - lseek(this->fd(), 0, ios_base::cur);
#endif
return 0;

View File

@ -56,6 +56,7 @@ namespace std
{
// Underlying data source/sink.
__c_file* _M_cfile;
// True iff we opened _M_cfile, and thus must close it ourselves.
bool _M_cfile_created;
@ -93,25 +94,25 @@ namespace std
~__basic_file();
streamsize
xsputn(const char* __s, streamsize __n, bool __stdio);
xsputn(const char* __s, streamsize __n);
streamsize
xsgetn(char* __s, streamsize __n, bool __stdio);
xsgetn(char* __s, streamsize __n);
streamoff
seekoff(streamoff __off, ios_base::seekdir __way, bool __stdio,
seekoff(streamoff __off, ios_base::seekdir __way,
ios_base::openmode __mode = ios_base::in | ios_base::out);
streamoff
seekpos(streamoff __pos, bool __stdio,
seekpos(streamoff __pos,
ios_base::openmode __mode = ios_base::in | ios_base::out);
int
sync();
streamsize
showmanyc_helper(bool __stdio);
showmanyc();
};
} // namespace std
#endif // _CPP_BASIC_FILE
#endif

View File

@ -217,6 +217,7 @@ ext_headers = \
${ext_srcdir}/algorithm \
${ext_srcdir}/enc_filebuf.h \
${ext_srcdir}/stdio_filebuf.h \
${ext_srcdir}/stdio_sync_filebuf.h \
${ext_srcdir}/functional \
${ext_srcdir}/hash_map \
${ext_srcdir}/hash_set \

View File

@ -337,6 +337,7 @@ ext_headers = \
${ext_srcdir}/algorithm \
${ext_srcdir}/enc_filebuf.h \
${ext_srcdir}/stdio_filebuf.h \
${ext_srcdir}/stdio_sync_filebuf.h \
${ext_srcdir}/functional \
${ext_srcdir}/hash_map \
${ext_srcdir}/hash_set \

View File

@ -165,7 +165,6 @@ namespace std
const bool __testin = this->_M_mode & ios_base::in;
const locale __loc = this->getloc();
const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc);
const bool __testsync = this->_M_buf_size <= 1;
if (__testin && this->is_open())
{
@ -174,13 +173,100 @@ namespace std
// For a stateful encoding (-1) the pending sequence might be just
// shift and unshift prefixes with no actual character.
if (__cvt.encoding() >= 0)
__ret += _M_file.showmanyc_helper(__testsync) / __cvt.max_length();
__ret += _M_file.showmanyc() / __cvt.max_length();
}
_M_last_overflowed = false;
return __ret;
}
template<typename _CharT, typename _Traits>
typename basic_filebuf<_CharT, _Traits>::int_type
basic_filebuf<_CharT, _Traits>::_M_underflow(bool __bump)
{
int_type __ret = traits_type::eof();
const bool __testin = this->_M_mode & ios_base::in;
const bool __testout = this->_M_mode & ios_base::out;
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_destroy_pback();
if (this->_M_in_cur < this->_M_in_end)
{
__ret = traits_type::to_int_type(*this->_M_in_cur);
if (__bump)
_M_move_in_cur(1);
return __ret;
}
// Sync internal and external buffers.
// NB: __testget -> __testput as _M_buf_unified here.
if (this->_M_in_cur > this->_M_in_beg)
{
if (__testout)
_M_overflow();
else if (this->_M_in_cur != _M_filepos)
_M_file.seekoff(this->_M_in_cur - _M_filepos, ios_base::cur,
ios_base::in);
}
if (_M_buf_size)
{
streamsize __elen = 0;
streamsize __ilen = 0;
const locale __loc = this->getloc();
const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc);
if (__cvt.always_noconv())
{
__elen = _M_file.xsgetn(reinterpret_cast<char*>(this->_M_in_beg), _M_buf_size);
__ilen = __elen;
}
else
{
char* __buf = static_cast<char*>(__builtin_alloca(_M_buf_size));
__elen = _M_file.xsgetn(__buf, _M_buf_size);
const char* __eend;
char_type* __iend;
codecvt_base::result __r;
__r = __cvt.in(_M_state_cur, __buf, __buf + __elen, __eend,
this->_M_in_beg,
this->_M_in_beg + _M_buf_size, __iend);
if (__r == codecvt_base::ok)
__ilen = __iend - this->_M_in_beg;
else if (__r == codecvt_base::noconv)
{
traits_type::copy(this->_M_in_beg,
reinterpret_cast<char_type*>(__buf),
__elen);
__ilen = __elen;
}
else
{
// Unwind.
__ilen = 0;
_M_file.seekoff(-__elen, ios_base::cur, ios_base::in);
}
}
if (0 < __ilen)
{
_M_set_determinate(__ilen);
__ret = traits_type::to_int_type(*this->_M_in_cur);
if (__bump)
_M_move_in_cur(1);
}
}
}
_M_last_overflowed = false;
return __ret;
}
template<typename _CharT, typename _Traits>
typename basic_filebuf<_CharT, _Traits>::int_type
basic_filebuf<_CharT, _Traits>::
@ -277,14 +363,12 @@ namespace std
_M_convert_to_external(_CharT* __ibuf, streamsize __ilen,
streamsize& __elen, streamsize& __plen)
{
const bool __testsync = this->_M_buf_size <= 1;
const locale __loc = this->getloc();
const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc);
if (__cvt.always_noconv() && __ilen)
{
__elen += _M_file.xsputn(reinterpret_cast<char*>(__ibuf),
__ilen, __testsync);
__elen += _M_file.xsputn(reinterpret_cast<char*>(__ibuf), __ilen);
__plen += __ilen;
}
else
@ -317,7 +401,7 @@ namespace std
if (__blen)
{
__elen += _M_file.xsputn(__buf, __blen, __testsync);
__elen += _M_file.xsputn(__buf, __blen);
__plen += __blen;
}
@ -331,7 +415,7 @@ namespace std
if (__r != codecvt_base::error)
{
__rlen = __bend - __buf;
__elen += _M_file.xsputn(__buf, __rlen, __testsync);
__elen += _M_file.xsputn(__buf, __rlen);
__plen += __rlen;
}
}
@ -346,7 +430,6 @@ namespace std
int_type __ret = traits_type::eof();
const bool __testput = this->_M_out_beg < this->_M_out_lim;
const bool __testunbuffered = _M_file.is_open() && !this->_M_buf_size;
const bool __testsync = this->_M_buf_size <= 1;
if (__testput || __testunbuffered)
{
@ -360,7 +443,7 @@ namespace std
if (_M_filepos && _M_filepos != this->_M_out_beg)
{
off_type __off = this->_M_out_beg - _M_filepos;
_M_file.seekoff(__off, ios_base::cur, __testsync);
_M_file.seekoff(__off, ios_base::cur);
}
// Convert internal buffer to external representation, output.
@ -434,7 +517,6 @@ namespace std
pos_type __ret = pos_type(off_type(-1));
const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
const bool __testsync = this->_M_buf_size <= 1;
int __width = 0;
if (has_facet<__codecvt_type>(this->_M_buf_locale))
@ -468,16 +550,14 @@ namespace std
__computed_off += this->_M_in_cur - _M_filepos;
// Return pos_type(off_type(-1)) in case of failure.
__ret = _M_file.seekoff(__computed_off, __way, __testsync,
__mode);
__ret = _M_file.seekoff(__computed_off, __way, __mode);
_M_set_indeterminate();
}
// NB: Need to do this in case _M_file in indeterminate
// state, ie _M_file._offset == -1
else
{
pos_type __tmp = _M_file.seekoff(__off, ios_base::cur,
__testsync, __mode);
pos_type __tmp = _M_file.seekoff(__off, ios_base::cur, __mode);
if (__tmp >= 0)
{
// Seek successful.

View File

@ -452,12 +452,6 @@ namespace std
Init();
~Init();
static void
_S_create_buffers(bool __sync);
static void
_S_destroy_buffers();
// NB: Allows debugger applications use of the standard streams
// from operator new. _S_ios_base_init must be incremented in
// _S_ios_create _after_ initialization is completed.

View File

@ -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

View File

@ -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

View File

@ -306,11 +306,13 @@ namespace std
// [documentation is inherited]
virtual int_type
underflow();
underflow()
{ return _M_underflow(false); }
// [documentation is inherited]
virtual int_type
uflow();
uflow()
{ return _M_underflow(true); }
// [documentation is inherited]
virtual int_type
@ -385,8 +387,6 @@ namespace std
{
int __ret = 0;
const bool __testput = this->_M_out_beg < this->_M_out_lim;
// Sync with stdio.
const bool __sync = this->_M_buf_size <= 1;
// Make sure that the internal buffer resyncs its idea of
// the file position with the external file.
@ -399,7 +399,7 @@ namespace std
if (traits_type::eq_int_type(_M_overflow(), traits_type::eof()))
__ret = -1;
else if (__off)
_M_file.seekoff(__off, ios_base::cur, __sync);
_M_file.seekoff(__off, ios_base::cur);
}
else
_M_file.sync();
@ -487,44 +487,6 @@ namespace std
}
};
// Explicit specialization declarations, defined in src/fstream.cc.
template<>
basic_filebuf<char>::int_type
basic_filebuf<char>::_M_underflow(bool __bump);
template<>
basic_filebuf<char>::int_type
basic_filebuf<char>::underflow();
template<>
basic_filebuf<char>::int_type
basic_filebuf<char>::uflow();
#ifdef _GLIBCPP_USE_WCHAR_T
template<>
basic_filebuf<wchar_t>::int_type
basic_filebuf<wchar_t>::_M_underflow(bool __bump);
template<>
basic_filebuf<wchar_t>::int_type
basic_filebuf<wchar_t>::underflow();
template<>
basic_filebuf<wchar_t>::int_type
basic_filebuf<wchar_t>::uflow();
#endif
// Generic definitions do nothing.
template <typename _CharT, typename _Traits>
typename basic_filebuf<_CharT, _Traits>::int_type
basic_filebuf<_CharT, _Traits>::underflow()
{ return int_type(); }
template <typename _CharT, typename _Traits>
typename basic_filebuf<_CharT, _Traits>::int_type
basic_filebuf<_CharT, _Traits>::uflow()
{ return int_type(); }
// [27.8.1.5] Template class basic_ifstream
/**
* @brief Controlling input for files.

View File

@ -123,7 +123,6 @@ sources = \
ctype.cc \
demangle.cc \
ext-inst.cc \
fstream.cc \
fstream-inst.cc \
functexcept.cc \
globals.cc \

View File

@ -1,4 +1,4 @@
# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@ -205,7 +205,6 @@ sources = \
ctype.cc \
demangle.cc \
ext-inst.cc \
fstream.cc \
fstream-inst.cc \
functexcept.cc \
globals.cc \
@ -306,9 +305,9 @@ CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
libstdc___la_OBJECTS = codecvt.lo complex_io.lo concept-inst.lo \
ctype.lo demangle.lo ext-inst.lo fstream.lo fstream-inst.lo \
functexcept.lo globals.lo io-inst.lo ios.lo istream-inst.lo limits.lo \
locale.lo locale-inst.lo localename.lo misc-inst.lo ostream-inst.lo \
ctype.lo demangle.lo ext-inst.lo fstream-inst.lo functexcept.lo \
globals.lo io-inst.lo ios.lo istream-inst.lo limits.lo locale.lo \
locale-inst.lo localename.lo misc-inst.lo ostream-inst.lo \
sstream-inst.lo stdexcept.lo stl-inst.lo streambuf-inst.lo \
string-inst.lo strstream.lo valarray-inst.lo wstring-inst.lo \
codecvt_members.lo collate_members.lo ctype_members.lo \

View File

@ -1,218 +0,0 @@
// File based streams -*- C++ -*-
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 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.
//
// ISO C++ 14882: 27.8 File-based streams
//
#include <fstream>
namespace std
{
template<>
basic_filebuf<char>::int_type
basic_filebuf<char>::_M_underflow(bool __bump)
{
int_type __ret = traits_type::eof();
const bool __testin = _M_mode & ios_base::in;
const bool __testout = _M_mode & ios_base::out;
const bool __testsync = _M_buf_size <= 1;
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_destroy_pback();
if (_M_in_cur < _M_in_end)
{
__ret = traits_type::to_int_type(*_M_in_cur);
if (__bump)
_M_move_in_cur(1);
return __ret;
}
// Sync internal and external buffers.
// NB: __testget -> __testput as _M_buf_unified here.
const bool __testget = _M_in_beg < _M_in_cur;
if (__testget)
{
if (__testout)
_M_overflow();
else if (_M_in_cur != _M_filepos)
_M_file.seekoff(_M_in_cur - _M_filepos,
ios_base::cur, __testsync, ios_base::in);
}
if (_M_buf_size)
{
streamsize __elen = 0;
streamsize __ilen = 0;
__elen = _M_file.xsgetn(reinterpret_cast<char*>(_M_in_beg),
_M_buf_size, __testsync);
__ilen = __elen;
if (0 < __ilen)
{
_M_set_determinate(__ilen);
__ret = traits_type::to_int_type(*_M_in_cur);
if (__bump)
_M_move_in_cur(1);
else if (__testsync)
{
// If we are synced with stdio, we have to unget the
// character we just read so that the file pointer
// doesn't move.
_M_file.sys_ungetc(traits_type::to_int_type(*_M_in_cur));
_M_set_indeterminate();
}
}
}
}
_M_last_overflowed = false;
return __ret;
}
template<>
basic_filebuf<char>::int_type
basic_filebuf<char>::underflow()
{ return _M_underflow(false); }
template<>
basic_filebuf<char>::int_type
basic_filebuf<char>::uflow()
{ return _M_underflow(true); }
#ifdef _GLIBCPP_USE_WCHAR_T
template<>
basic_filebuf<wchar_t>::int_type
basic_filebuf<wchar_t>::_M_underflow(bool __bump)
{
int_type __ret = traits_type::eof();
const bool __testin = _M_mode & ios_base::in;
const bool __testout = _M_mode & ios_base::out;
const bool __testsync = _M_buf_size <= 1;
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_destroy_pback();
if (_M_in_cur < _M_in_end)
{
__ret = traits_type::to_int_type(*_M_in_cur);
if (__bump)
_M_move_in_cur(1);
return __ret;
}
// Sync internal and external buffers.
// NB: __testget -> __testput as _M_buf_unified here.
const bool __testget = _M_in_beg < _M_in_cur;
if (__testget)
{
if (__testout)
_M_overflow();
else if (_M_in_cur != _M_filepos)
_M_file.seekoff(_M_in_cur - _M_filepos,
ios_base::cur, __testsync, ios_base::in);
}
if (_M_buf_size)
{
streamsize __elen = 0;
streamsize __ilen = 0;
const locale __loc = this->getloc();
const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc);
if (__cvt.always_noconv())
{
__elen = _M_file.xsgetn(reinterpret_cast<char*>(_M_in_beg),
_M_buf_size, __testsync);
__ilen = __elen;
}
else
{
char* __buf = static_cast<char*>(__builtin_alloca(_M_buf_size));
__elen = _M_file.xsgetn(__buf, _M_buf_size, __testsync);
const char* __eend;
char_type* __iend;
codecvt_base::result __r;
__r = __cvt.in(_M_state_cur, __buf, __buf + __elen, __eend,
_M_in_beg, _M_in_beg + _M_buf_size, __iend);
if (__r == codecvt_base::ok)
__ilen = __iend - _M_in_beg;
else
{
// Unwind.
__ilen = 0;
_M_file.seekoff(-__elen, ios_base::cur, __testsync,
ios_base::in);
}
}
if (0 < __ilen)
{
_M_set_determinate(__ilen);
__ret = traits_type::to_int_type(*_M_in_cur);
if (__bump)
_M_move_in_cur(1);
else if (__testsync)
{
// If we are synced with stdio, we have to unget the
// character we just read so that the file pointer
// doesn't move.
_M_file.sys_ungetc(traits_type::to_int_type(*_M_in_cur));
_M_set_indeterminate();
}
}
}
}
_M_last_overflowed = false;
return __ret;
}
template<>
basic_filebuf<wchar_t>::int_type
basic_filebuf<wchar_t>::underflow()
{ return _M_underflow(false); }
template<>
basic_filebuf<wchar_t>::int_type
basic_filebuf<wchar_t>::uflow()
{ return _M_underflow(true); }
#endif
} // namespace std

View File

@ -32,6 +32,7 @@
#include <ostream>
#include <locale>
#include <ext/stdio_filebuf.h>
#include <ext/stdio_sync_filebuf.h>
// On AIX, and perhaps other systems, library initialization order is
// not guaranteed. For example, the static initializers for the main
@ -78,9 +79,14 @@ namespace __gnu_cxx
{
using namespace std;
// Because <iostream> declares the standard streams to be [io]stream
// types instead of say [io]fstream types, it is also necessary to
// allocate the actual file buffers in this file.
// We use different stream buffer types depending on whether
// ios_base::sync_with_stdio(false) has been called.
typedef char fake_stdiobuf[sizeof(stdio_sync_filebuf<char>)]
__attribute__ ((aligned(__alignof__(stdio_sync_filebuf<char>))));
fake_stdiobuf buf_cout_sync;
fake_stdiobuf buf_cin_sync;
fake_stdiobuf buf_cerr_sync;
typedef char fake_filebuf[sizeof(stdio_filebuf<char>)]
__attribute__ ((aligned(__alignof__(stdio_filebuf<char>))));
fake_filebuf buf_cout;
@ -88,6 +94,12 @@ namespace __gnu_cxx
fake_filebuf buf_cerr;
#ifdef _GLIBCPP_USE_WCHAR_T
typedef char fake_wstdiobuf[sizeof(stdio_sync_filebuf<wchar_t>)]
__attribute__ ((aligned(__alignof__(stdio_sync_filebuf<wchar_t>))));
fake_wstdiobuf buf_wcout_sync;
fake_wstdiobuf buf_wcin_sync;
fake_wstdiobuf buf_wcerr_sync;
typedef char fake_wfilebuf[sizeof(stdio_filebuf<wchar_t>)]
__attribute__ ((aligned(__alignof__(stdio_filebuf<wchar_t>))));
fake_wfilebuf buf_wcout;

View File

@ -38,15 +38,24 @@
#include <fstream>
#include <bits/atomicity.h>
#include <ext/stdio_filebuf.h>
#include <ext/stdio_sync_filebuf.h>
namespace __gnu_cxx
{
// Extern declarations for global objects in src/globals.cc.
extern stdio_sync_filebuf<char> buf_cout_sync;
extern stdio_sync_filebuf<char> buf_cin_sync;
extern stdio_sync_filebuf<char> buf_cerr_sync;
extern stdio_filebuf<char> buf_cout;
extern stdio_filebuf<char> buf_cin;
extern stdio_filebuf<char> buf_cerr;
#ifdef _GLIBCPP_USE_WCHAR_T
extern stdio_sync_filebuf<wchar_t> buf_wcout_sync;
extern stdio_sync_filebuf<wchar_t> buf_wcin_sync;
extern stdio_sync_filebuf<wchar_t> buf_wcerr_sync;
extern stdio_filebuf<wchar_t> buf_wcout;
extern stdio_filebuf<wchar_t> buf_wcin;
extern stdio_filebuf<wchar_t> buf_wcerr;
@ -153,50 +162,6 @@ namespace std
ios_base::failure::what() const throw()
{ return _M_name; }
void
ios_base::Init::_S_create_buffers(bool __sync)
{
size_t __out_size = __sync ? 0 : static_cast<size_t>(BUFSIZ);
size_t __in_size = __sync ? 1 : static_cast<size_t>(BUFSIZ);
// Create stream buffers for the standard streams and use those
// buffers without destroying and recreating the streams.
new (&buf_cout) stdio_filebuf<char>(stdout, ios_base::out, __out_size);
new (&buf_cin) stdio_filebuf<char>(stdin, ios_base::in, __in_size);
new (&buf_cerr) stdio_filebuf<char>(stderr, ios_base::out, __out_size);
cout.rdbuf(&buf_cout);
cin.rdbuf(&buf_cin);
cerr.rdbuf(&buf_cerr);
clog.rdbuf(&buf_cerr);
#ifdef _GLIBCPP_USE_WCHAR_T
new (&buf_wcout) stdio_filebuf<wchar_t>(stdout, ios_base::out, __out_size);
new (&buf_wcin) stdio_filebuf<wchar_t>(stdin, ios_base::in, __in_size);
new (&buf_wcerr) stdio_filebuf<wchar_t>(stderr, ios_base::out, __out_size);
wcout.rdbuf(&buf_wcout);
wcin.rdbuf(&buf_wcin);
wcerr.rdbuf(&buf_wcerr);
wclog.rdbuf(&buf_wcerr);
#endif
}
void
ios_base::Init::_S_destroy_buffers()
{
// Explicitly call dtors to free any memory that is dynamically
// allocated by filebuf ctor or member functions, but don't
// deallocate all memory by calling operator delete.
buf_cout.~stdio_filebuf();
buf_cin.~stdio_filebuf();
buf_cerr.~stdio_filebuf();
#ifdef _GLIBCPP_USE_WCHAR_T
buf_wcout.~stdio_filebuf();
buf_wcin.~stdio_filebuf();
buf_wcerr.~stdio_filebuf();
#endif
}
ios_base::Init::Init()
{
if (_S_ios_base_init == 0)
@ -204,25 +169,32 @@ namespace std
// Standard streams default to synced with "C" operations.
ios_base::Init::_S_synced_with_stdio = true;
// The standard streams are constructed once only and never destroyed.
// The stream buffers are set in _S_create_buffers below.
new (&cout) ostream(NULL);
new (&cin) istream(NULL);
new (&cerr) ostream(NULL);
new (&clog) ostream(NULL);
new (&buf_cout_sync) stdio_sync_filebuf<char>(stdout);
new (&buf_cin_sync) stdio_sync_filebuf<char>(stdin);
new (&buf_cerr_sync) stdio_sync_filebuf<char>(stderr);
// The standard streams are constructed once only and never
// destroyed.
new (&cout) ostream(&buf_cout_sync);
new (&cin) istream(&buf_cin_sync);
new (&cerr) ostream(&buf_cerr_sync);
new (&clog) ostream(&buf_cerr_sync);
cin.tie(&cout);
cerr.flags(ios_base::unitbuf);
#ifdef _GLIBCPP_USE_WCHAR_T
new (&wcout) wostream(NULL);
new (&wcin) wistream(NULL);
new (&wcerr) wostream(NULL);
new (&wclog) wostream(NULL);
new (&buf_wcout_sync) stdio_sync_filebuf<wchar_t>(stdout);
new (&buf_wcin_sync) stdio_sync_filebuf<wchar_t>(stdin);
new (&buf_wcerr_sync) stdio_sync_filebuf<wchar_t>(stderr);
new (&wcout) wostream(&buf_wcout_sync);
new (&wcin) wistream(&buf_wcin_sync);
new (&wcerr) wostream(&buf_wcerr_sync);
new (&wclog) wostream(&buf_wcerr_sync);
wcin.tie(&wcout);
wcerr.flags(ios_base::unitbuf);
#endif
_S_create_buffers(ios_base::Init::_S_synced_with_stdio);
_S_ios_base_init = 1;
}
++_S_ios_base_init;
@ -389,8 +361,40 @@ namespace std
if (!__sync && __ret)
{
ios_base::Init::_S_synced_with_stdio = __sync;
ios_base::Init::_S_destroy_buffers();
ios_base::Init::_S_create_buffers(__sync);
// Explicitly call dtors to free any memory that is
// dynamically allocated by filebuf ctor or member functions,
// but don't deallocate all memory by calling operator delete.
buf_cout_sync.~stdio_sync_filebuf<char>();
buf_cin_sync.~stdio_sync_filebuf<char>();
buf_cerr_sync.~stdio_sync_filebuf<char>();
#ifdef _GLIBCPP_USE_WCHAR_T
buf_wcout_sync.~stdio_sync_filebuf<wchar_t>();
buf_wcin_sync.~stdio_sync_filebuf<wchar_t>();
buf_wcerr_sync.~stdio_sync_filebuf<wchar_t>();
#endif
// Create stream buffers for the standard streams and use
// those buffers without destroying and recreating the
// streams.
new (&buf_cout) stdio_filebuf<char>(stdout, ios_base::out);
new (&buf_cin) stdio_filebuf<char>(stdin, ios_base::in);
new (&buf_cerr) stdio_filebuf<char>(stderr, ios_base::out);
cout.rdbuf(&buf_cout);
cin.rdbuf(&buf_cin);
cerr.rdbuf(&buf_cerr);
clog.rdbuf(&buf_cerr);
#ifdef _GLIBCPP_USE_WCHAR_T
new (&buf_wcout) stdio_filebuf<wchar_t>(stdout, ios_base::out);
new (&buf_wcin) stdio_filebuf<wchar_t>(stdin, ios_base::in);
new (&buf_wcerr) stdio_filebuf<wchar_t>(stderr, ios_base::out);
wcout.rdbuf(&buf_wcout);
wcin.rdbuf(&buf_wcin);
wcerr.rdbuf(&buf_wcerr);
wclog.rdbuf(&buf_wcerr);
#endif
}
return __ret;
}

View File

@ -38,6 +38,7 @@
#include <algorithm>
#include <vector>
#include <bits/atomicity.h>
#include <ext/stdio_sync_filebuf.h>
namespace std
{
@ -73,9 +74,10 @@ namespace std
#endif
} // namespace std
#ifdef _GLIBCPP_NEED_GENERIC_MUTEX
namespace __gnu_cxx
{
#ifdef _GLIBCPP_NEED_GENERIC_MUTEX
#ifdef __GTHREAD_MUTEX_INIT
__gthread_mutex_t _Atomic_add_mutex = __GTHREAD_MUTEX_INIT;
#else
@ -87,6 +89,12 @@ namespace __gnu_cxx
__GTHREAD_MUTEX_INIT_FUNCTION (&_Atomic_add_mutex);
}
#endif
} // namespace __gnu_cxx
#endif // _GLIBCPP_NEED_GLOBAL_MUTEX
template class stdio_sync_filebuf<char>;
#ifdef _GLIBCPP_USE_WCHAR_T
template class stdio_sync_filebuf<wchar_t>;
#endif
} // namespace __gnu_cxx

View File

@ -76,28 +76,31 @@ void test05()
fb_01.open(name_01, ios_base::in);
fb_02.open(name_02, ios_base::out | ios_base::trunc);
fb_03.open(name_03, ios_base::out | ios_base::in | ios_base::trunc);
strmof_1 = fb_01.in_avail();
strmof_2 = fb_02.in_avail();
strmof_1 = fb_03.in_avail();
int_type c1 = fb_01.sbumpc();
int_type c2 = fb_02.sbumpc();
int_type c3 = fb_01.sbumpc();
int_type c4 = fb_02.sbumpc();
int_type c5 = fb_03.sbumpc();
int_type c6 = fb_01.sgetc();
int_type c7 = fb_02.sgetc();
int_type c8 = fb_01.sgetc();
strmof_2 = fb_02.in_avail();
int_type c2 = fb_02.sbumpc();
int_type c4 = fb_02.sbumpc();
int_type c7 = fb_02.sgetc();
int_type c9 = fb_02.sgetc();
strmof_1 = fb_03.in_avail();
int_type c5 = fb_03.sbumpc();
c5 = fb_03.sgetc();
// int_type snextc()
// calls sbumpc and if sbumpc != eof, return sgetc
c6 = fb_01.snextc();
c7 = fb_02.snextc();
c6 = fb_01.snextc();
c7 = fb_02.snextc();
c7 = fb_02.snextc();
c5 = fb_03.snextc();
// streamsize sgetn(char_type *s, streamsize n)

View File

@ -0,0 +1,70 @@
// 2003-05-03 Petur Runolfsson <peturr02@ru.is>
// 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.
// 27.8.1.4 Overridden virtual functions
#include <fstream>
#include <string>
#include <testsuite_hooks.h>
class MyTraits : public std::char_traits<char>
{
};
// libstdc++/10096
void test01()
{
using namespace std;
const char* name = "filebuf_virtuals-1.txt";
string str;
filebuf fb1;
fb1.open(name, ios_base::in);
filebuf::int_type c1;
while ((c1 = fb1.sbumpc()) != filebuf::traits_type::eof())
str.push_back(filebuf::traits_type::to_char_type(c1));
fb1.close();
basic_filebuf<char, MyTraits> fb;
VERIFY( fb.sgetc() == MyTraits::eof() );
fb.open(name, ios_base::in);
VERIFY( fb.is_open() );
for (string::iterator i = str.begin(); i != str.end(); ++i)
{
MyTraits::int_type c2 = fb.sbumpc();
VERIFY( c2 != MyTraits::eof() );
VERIFY( c2 == MyTraits::to_int_type(*i) );
}
VERIFY( fb.sgetc() == MyTraits::eof() );
fb.close();
VERIFY( !fb.is_open() );
VERIFY( fb.sgetc() == MyTraits::eof() );
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,84 @@
// 2003-05-03 Petur Runolfsson <peturr02@ru.is>
// 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.
// 27.8.1.4 Overridden virtual functions
#include <fstream>
#include <locale>
#include <string>
#include <testsuite_hooks.h>
// Check that basic_filebuf::underflow() handles
// codecvt::always_noconv() == false and codecvt::in() == noconv.
class NoconvCvt : public std::codecvt<char, char, std::mbstate_t>
{
protected:
virtual bool
do_always_noconv() const throw()
{ return false; }
virtual result
do_in(state_type&, const char* from, const char*, const char*& from_next,
char* to, char*, char*& to_next)
{
from_next = from;
to_next = to;
return noconv;
}
};
void test01()
{
using namespace std;
bool test = true;
const char* name = "filebuf_virtuals-1.txt";
string str;
filebuf fb;
filebuf::int_type c1;
if (fb.open(name, ios_base::in))
{
while ((c1 = fb.sbumpc()) != EOF)
str.push_back(filebuf::traits_type::to_char_type(c1));
fb.close();
}
locale loc(locale::classic(), new NoconvCvt);
fb.pubimbue(loc);
if (fb.open(name, ios_base::in))
{
for (string::iterator i = str.begin(); i != str.end(); ++i)
{
c1 = fb.sbumpc();
VERIFY( c1 != filebuf::traits_type::eof() );
VERIFY( c1 == filebuf::traits_type::to_int_type(*i) );
}
VERIFY( fb.sgetc() == filebuf::traits_type::eof() );
fb.close();
}
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,86 @@
// 2003-05-03 Petur Runolfsson <peturr02@ru.is>
// 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.
// 27.8.1.4 Overridden virtual functions
#include <locale>
#include <fstream>
#include <cctype>
#include <testsuite_hooks.h>
class Cvt_to_upper : public std::codecvt<char, char, std::mbstate_t>
{
typedef std::codecvt<char, char, std::mbstate_t> Base;
public:
explicit Cvt_to_upper(std::size_t refs = 0)
: Base(refs)
{ }
protected:
virtual result
do_in(state_type&,
const extern_type* from, const extern_type* from_end,
const extern_type*& from_next,
intern_type* to, intern_type* to_end,
intern_type*& to_next) const
{
while (from < from_end && to < to_end)
*to++ = std::toupper(*from++);
to_next = to;
from_next = from;
return from == from_end ? ok : partial;
}
virtual bool
do_always_noconv() const throw()
{
return false;
}
};
// libstdc++/9027
void test01()
{
using namespace std;
bool test = true;
const char* name = "filebuf_virtuals-1.txt";
locale loc (locale::classic(), new Cvt_to_upper);
filebuf fbin;
fbin.pubimbue(loc);
fbin.open(name, ios_base::in);
int c;
while ((c = fbin.sbumpc()) != EOF)
{
VERIFY( !islower(c) );
}
fbin.close();
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,60 @@
// 2003-05-03 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <testsuite_hooks.h>
#include <fstream>
#include <cstdio>
// libstdc++/9520
void test01()
{
using namespace std;
bool test = true;
const char* name = "tmp_9520";
FILE* file = fopen(name, "w");
for (int i = 1; i < 256; ++i)
putc(static_cast<unsigned char>(i), file);
fclose(file);
locale loc (__gnu_cxx_test::try_named_locale("de_DE.ISO-8859-15@euro"));
wchar_t buf[1];
wfilebuf fb;
fb.pubimbue(loc);
fb.pubsetbuf(buf, 1);
fb.open(name, ios_base::in);
for (int j = 1; j < 256; ++j)
{
wfilebuf::int_type c1 = fb.sgetc();
VERIFY( c1 != wfilebuf::traits_type::eof() );
wfilebuf::int_type c2 = fb.sbumpc();
VERIFY( c1 == c2 );
}
fb.close();
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,73 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <iostream>
#include <cstdio>
#include <testsuite_hooks.h>
void test10()
{
using namespace std;
bool test = true;
const char* name = "filebuf_virtuals-1.txt";
FILE* ret = freopen(name, "r", stdin);
VERIFY( ret != NULL );
streampos p1 = cin.tellg();
VERIFY( p1 != streampos(-1) );
VERIFY( streamoff(p1) == 0 );
cin.seekg(0, ios::end);
VERIFY( cin.good() );
streampos p2 = cin.tellg();
VERIFY( p2 != streampos(-1) );
VERIFY( p2 != p1 );
VERIFY( streamoff(p2) == ftell(stdin) );
cin.seekg(p1);
VERIFY( cin.good() );
streamoff n = p2 - p1;
VERIFY( n > 0 );
for (streamoff i = 0; i < n; ++i)
{
streampos p3 = cin.tellg();
VERIFY( streamoff(p3) == i );
VERIFY( ftell(stdin) == i );
cin.get();
VERIFY( cin.good() );
}
streampos p4 = cin.tellg();
VERIFY( streamoff(p4) == n );
VERIFY( ftell(stdin) == n );
cin.get();
VERIFY( cin.eof() );
}
int main()
{
test10();
return 0;
}

View File

@ -0,0 +1,47 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <iostream>
#include <cstdio>
#include <testsuite_hooks.h>
void test09()
{
using namespace std;
bool test = true;
const char* name = "tmp_09";
FILE* fout = fopen(name, "w");
fputs("abc\n", fout);
fclose(fout);
freopen(name, "r", stdin);
// The number of unread characters should be 4 (a, b, c, \\n)
VERIFY( 4 == std::cin.rdbuf()->in_avail() );
}
int
main()
{
test09();
return 0;
}

View File

@ -0,0 +1,85 @@
// 2003-04-30 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <testsuite_hooks.h>
#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
// Check that cin.rdbuf()->sputbackc() puts characters back to stdin.
// If cin.rdbuf() is a filebuf, this succeeds when stdin is a regular
// file, but fails otherwise, hence the named fifo.
void test01()
{
using namespace std;
bool test = true;
const char* name = "tmp_fifo5";
signal(SIGPIPE, SIG_IGN);
unlink(name);
mkfifo(name, S_IRWXU);
int child = fork();
VERIFY( child != -1 );
if (child == 0)
{
sleep(1);
FILE* file = fopen(name, "w");
fputs("Whatever\n", file);
fflush(file);
sleep(2);
fclose(file);
exit(0);
}
freopen(name, "r", stdin);
sleep(2);
int c1 = fgetc(stdin);
VERIFY( c1 != EOF );
int c2 = cin.rdbuf()->sputbackc('a');
VERIFY( c2 != EOF );
VERIFY( c2 == 'a' );
int c3 = fgetc(stdin);
VERIFY( c3 != EOF );
VERIFY( c3 == c2 );
int c4 = ungetc('b', stdin);
VERIFY( c4 != EOF );
VERIFY( c4 == 'b' );
int c5 = cin.rdbuf()->sgetc();
VERIFY( c5 != EOF );
VERIFY( c5 == c4 );
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,47 @@
// 2003-04-30 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <testsuite_hooks.h>
#include <cstdio>
#include <iostream>
void test02()
{
using namespace std;
bool test = true;
int c1 = fgetc(stdin);
int c2 = cin.rdbuf()->sputbackc(c1);
VERIFY( c2 == c1 );
int c3 = fgetc(stdin);
VERIFY( c3 == c1 );
ungetc(c3, stdin);
int c4 = cin.rdbuf()->sgetc();
VERIFY( c4 == c3 );
}
int main()
{
test02();
return 0;
}

View File

@ -0,0 +1 @@
For what you dream of

View File

@ -1,4 +1,4 @@
// 2000-08-02 bkoz
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2003 Free Software Foundation, Inc.
//

View File

@ -0,0 +1,121 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <iostream>
#include <cstdio>
#include <testsuite_hooks.h>
// Test handling of UTF-8 in wcin and wcout
void test10()
{
using namespace std;
bool test = true;
const char* name = "tmp_10";
locale loc(__gnu_cxx_test::try_named_locale("se_NO.UTF-8"));
locale::global(loc);
wcin.imbue(loc);
wcout.imbue(loc);
const char* e_lit =
"\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13"
"\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20!\"#$%&"
"'()*+,-./0123456789:;<=>?@}~\x7f\xc2\x80\xc2\x81\xc2\x82\xc2"
"\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a"
"\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f\xc2\x90\xc2\x91\xc2"
"\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99"
"\xc2\x9a\xc2\x9b\xc2\x9c\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3"
"\xbe\xc3\xbf\xc4\x80\xc4\x81\xc4\x82\xc4\x83\xc4\x84\xc4\x85"
"\xc4\x86\xc4\x87\xc4\x88\xc4\x89\xc4\x8a\xc4\x8b\xc4\x8c\xc4"
"\x8d\xc4\x8e\xc4\x8f\xc4\x90\xc4\x91\xc4\x92\xc4\x93\xc4\x94"
"\xc4\x95\xc4\x96\xc4\x97\xc4\x98\xc4\x99\xdf\xb8\xdf\xb9\xdf"
"\xba\xdf\xbb\xdf\xbc\xdf\xbd\xdf\xbe\xdf\xbf\xe0\xa0\x80\xe0"
"\xa0\x81\xe0\xa0\x82\xe0\xa0\x83\xe0\xa0\x84\xe0\xa0\x85\xe0"
"\xa0\x86\xe0\xa0\x87\xe0\xa0\x88\xe0\xa0\x89\xe0\xa0\x8a\xe0"
"\xa0\x8b\xe0\xa0\x8c\xe0\xa0\x8d\xe0\xa0\x8e\xe0\xa0\x8f\xe0"
"\xa0\x90\xe0\xa0\x91\xe0\xa0\x92\xe0\xa0\x93\xe0\xa0\x94\xe0"
"\xa0\x95\xe0\xa0\x96\xe0\xa0\x97\x1\x2\x4\x8\x10\x20@\xc2\x80"
"\xc4\x80\xc8\x80\xd0\x80\xe0\xa0\x80\xe1\x80\x80\xe2\x80\x80"
"\xe4\x80\x80\xe8\x80\x80\xf0\x90\x80\x80\xf0\xa0\x80\x80\xf1"
"\x80\x80\x80\xf2\x80\x80\x80\xf4\x80\x80\x80\xf8\x88\x80\x80"
"\x80\xf8\x90\x80\x80\x80\xf8\xa0\x80\x80\x80\xf9\x80\x80\x80"
"\x80\xfa\x80\x80\x80\x80\xfc\x84\x80\x80\x80\x80\xfc\x88\x80"
"\x80\x80\x80\xfc\x90\x80\x80\x80\x80\xfc\xa0\x80\x80\x80\x80"
"\xfd\x80\x80\x80\x80\x80";
size_t e_size = strlen(e_lit);
const wchar_t i_lit[] = {
0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc,
0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, L'!',
L'"', L'#', L'$', L'%', L'&', L'\'', L'(', L')', L'*', L'+',
L',', L'-', L'.', L'/', L'0', L'1', L'2', L'3', L'4', L'5',
L'6', L'7', L'8', L'9', L':', L';', L'<', L'=', L'>', L'?',
L'@', L'}', L'~', 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
0x9a, 0x9b, 0x9c, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x100,
0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109,
0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 0x110, 0x111, 0x112,
0x113, 0x114, 0x115, 0x116, 0x117, 0x118, 0x119, 0x7f8, 0x7f9,
0x7fa, 0x7fb, 0x7fc, 0x7fd, 0x7fe, 0x7ff, 0x800, 0x801, 0x802,
0x803, 0x804, 0x805, 0x806, 0x807, 0x808, 0x809, 0x80a, 0x80b,
0x80c, 0x80d, 0x80e, 0x80f, 0x810, 0x811, 0x812, 0x813, 0x814,
0x815, 0x816, 0x817, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, L'@',
0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000,
0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000,
0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000,
0x20000000, 0x40000000, 0x0
};
size_t i_size = wcslen(i_lit);
freopen(name, "w", stdout);
wcout.write(i_lit, i_size);
wcout.flush();
VERIFY( wcout.good() );
FILE* file = fopen(name, "r");
char* buf = new char[e_size + 10];
size_t n = fread(buf, 1, e_size + 10, file);
VERIFY( n == e_size );
VERIFY( !memcmp(buf, e_lit, e_size) );
delete[] buf;
fclose(file);
freopen(name, "r", stdin);
wchar_t* wbuf = new wchar_t[i_size + 10];
wcin.read(wbuf, i_size + 10);
n = wcin.gcount();
VERIFY( n == i_size );
VERIFY( !wmemcmp(wbuf, i_lit, i_size) );
VERIFY( wcin.eof() );
VERIFY( wcin.fail() );
VERIFY( !wcin.bad() );
delete[] wbuf;
}
int main()
{
test10();
return 0;
}

View File

@ -0,0 +1,47 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
// Interactive test, to be exercised as follows:
// assign stderr to stdout in shell command line,
// pipe stdout to cat process and/or redirect stdout to file.
// a.out >& output
// "hello fine world\n" should be written to stdout, and output, in
// proper order. This is a version of the scott snyder test taken
// from: http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00108.html
void test04()
{
using namespace std;
wcout << L"hello ";
wcout.flush();
wcerr << L"fine ";
wcerr.flush();
wcout << L"world" << endl;
wcout.flush();
}
int
main()
{
test04();
return 0;
}

View File

@ -0,0 +1,89 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
// Include all the headers except for iostream.
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <testsuite_hooks.h>
// Include iostream last, just to make is as difficult as possible to
// properly initialize the standard iostream objects.
#include <iostream>
// libstdc++/2523
void test02()
{
using namespace std;
int i;
wcin >> i;
wcout << "i == " << i << endl;
}
int
main()
{
test02();
return 0;
}

View File

@ -0,0 +1 @@
5588885

View File

@ -0,0 +1,39 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
// libstdc++/2523
void test03()
{
using namespace std;
ios_base::sync_with_stdio(false);
int i;
wcin >> i;
wcout << "i == " << i << endl;
}
int
main()
{
test03();
return 0;
}

View File

@ -0,0 +1 @@
33332

View File

@ -0,0 +1,86 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2001, 2002, 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.
#include <fstream>
#include <iostream>
#include <testsuite_hooks.h>
class gnu_filebuf: public std::wfilebuf
{
int i;
public:
gnu_filebuf(int j = 1): i(j) { }
~gnu_filebuf() { --i; }
int get_i() { return i;}
};
const int initial = 4;
gnu_filebuf buf(initial);
// libstdc++/3045, in a vague way.
void test01()
{
bool test = true;
int k1;
// 1 normal
k1 = buf.get_i();
VERIFY( k1 == initial );
{
std::wcout.rdbuf(&buf);
}
k1 = buf.get_i();
VERIFY( k1 == initial );
// 2 syncd off
k1 = buf.get_i();
VERIFY( k1 == initial );
{
std::wcout.rdbuf(&buf);
std::ios_base::sync_with_stdio(false); // make sure doesn't clobber buf
}
k1 = buf.get_i();
VERIFY( k1 == initial );
// 3 callling init
k1 = buf.get_i();
VERIFY( k1 == initial );
{
std::wcout.rdbuf(&buf);
std::ios_base::Init make_sure_initialized;
}
k1 = buf.get_i();
VERIFY( k1 == initial );
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,46 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2002, 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.
// 27.6.1.5 - Template class basic_iostream
// NB: This file is for testing iostream with NO OTHER INCLUDES.
#include <iostream>
// libstdc++/3647
void test07()
{
// Should not block.
std::wcout << std::wcin.rdbuf()->in_avail() << std::endl;
}
int main()
{
test07();
return 0;
}

View File

@ -0,0 +1,42 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
// Interactive test, to be exercised as follows:
// run test under truss(1) or strace(1). Look at
// size and pattern of write system calls.
// Should be 2 or 3 write(1,[...]) calls when run interactively
// depending upon buffering mode enforced.
void test05()
{
std::wcout << L"hello" << L' ' << L"world" << std::endl;
std::wcout << L"Enter your name: ";
std::wstring s;
std::wcin >> s;
std::wcout << L"hello " << s << std::endl;
}
int
main()
{
test05();
return 0;
}

View File

@ -0,0 +1 @@
JOHN HUME and DAVID TRIMBLE

View File

@ -0,0 +1,39 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
// http://gcc.gnu.org/ml/libstdc++/2002-08/msg00060.html
// Should only have to hit enter once.
void
test10()
{
using namespace std;
wcout << L"Press ENTER once\n";
wcin.ignore(1);
wcout << L"_M_gcount: " << wcin.gcount() << endl;
}
int
main()
{
test10();
return 0;
}

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,85 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2003 Free Software Foundation
//
// 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.
// 27.3 Standard iostream objects
// Check that standard streams can be used from constructors and
// destructors of static objects, provided that an instance of
// ios_base::Init has been constructed.
void init_standard_streams();
int use_standard_streams();
struct Strange
{
int i;
Strange()
{
init_standard_streams();
i = use_standard_streams();
}
~Strange()
{
use_standard_streams();
init_standard_streams();
}
};
static Strange static_ob;
#include <testsuite_hooks.h>
#include <iostream>
void init_standard_streams()
{
std::ios_base::Init init;
}
int use_standard_streams()
{
std::wcout << L"Hello, world!" << std::endl;
std::wcerr << L"World, hello!" << std::endl;
int ret = std::ios_base::xalloc();
std::wcin.iword(ret) = ret + 1;
std::wcout.iword(ret) = ret + 2;
std::wcerr.iword(ret) = ret + 3;
std::wclog.iword(ret) = ret + 4;
return ret;
}
void test05()
{
bool test = true;
int i = static_ob.i;
VERIFY( std::wcin.iword(i) == i + 1 );
VERIFY( std::wcout.iword(i) == i + 2 );
VERIFY( std::wcerr.iword(i) == i + 3 );
VERIFY( std::wclog.iword(i) == i + 4 );
}
int main()
{
test05();
return 0;
}

View File

@ -0,0 +1,46 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2001, 2002, 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.
#include <sstream>
#include <iostream>
// libstdc++/5268
void test04()
{
std::wstringbuf b1;
std::wcout.rdbuf( &b1 );
std::wcout << L"hello\n";
std::wcout.rdbuf(NULL);
}
int main()
{
test04();
return 0;
}

View File

@ -0,0 +1,48 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
// libstdc++/5280
// Interactive test: input "1234^D^D" for i should terminate for EOF.
void test06()
{
using namespace std;
int i;
wcin >> i;
if (!wcin.good())
{
wcerr << endl;
wcerr << L"i == " << i << endl;
wcerr << L"wcin.rdstate() == " << wcin.rdstate() << endl;
wcerr << L"wcin.bad() == " << wcin.bad() << endl;
wcerr << L"wcin.fail() == " << wcin.fail() << endl;
wcerr << L"wcin.eof() == " << wcin.eof() << endl;
}
else
wcerr << L"i == " << i << endl;
}
int
main()
{
test06();
return 0;
}

View File

@ -0,0 +1 @@
1234

View File

@ -0,0 +1,50 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2003 Free Software Foundation
//
// 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.
// 27.3 Standard iostream objects
// ios_base::Init::~Init() calls wcout.flush(), which may call
// wcout.setstate(badbit), which may throw an exception. Check that
// the exception doesn't escape from the destructor.
#include <iostream>
#include <streambuf>
class Badbuf : public std::wstreambuf
{
protected:
virtual int sync()
{
return -1;
}
};
void test06()
{
std::ios_base::Init init;
std::wcout.rdbuf(new Badbuf);
std::wcout.exceptions(std::ios_base::badbit);
}
int main()
{
test06();
return 0;
}

View File

@ -0,0 +1,39 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
#include <testsuite_hooks.h>
// libstdc++/6548
void test07()
{
bool test = true;
std::wcout << L"Enter 'test':";
std::wstring s;
std::getline(std::wcin, s, L'\n');
VERIFY( s == L"test" );
}
int
main()
{
test07();
return 0;
}

View File

@ -0,0 +1 @@
test

View File

@ -0,0 +1,38 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
// libstdc++/6648
// Interactive tests: each one (run alone) must terminate upon a single '\n'.
void test08()
{
bool test = true;
wchar_t buff[2048];
std::wcout << "Enter name: ";
std::wcin.getline(buff, 2048);
}
int
main()
{
test08();
return 0;
}

View File

@ -0,0 +1 @@
Kofi A. Annan

View File

@ -0,0 +1,35 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
void test09()
{
bool test = true;
std::wcout << L"Enter favorite beach: ";
std::wcin.ignore(2048, '\n');
}
int
main()
{
test09();
return 0;
}

View File

@ -0,0 +1 @@
Oak St. Beach, Chicago

View File

@ -0,0 +1,75 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// 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.
// 27.3 Standard iostream objects
#include <fstream>
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <testsuite_hooks.h>
// Check that wcout.flush() is called when last ios_base::Init is destroyed.
void test07()
{
using namespace std;
bool test = true;
const char* name = "tmp_fifo4";
signal(SIGPIPE, SIG_IGN);
unlink(name);
mkfifo(name, S_IRWXU);
int child = fork();
VERIFY( child != -1 );
if (child == 0)
{
wfilebuf fbout;
sleep(1);
fbout.open(name, ios_base::out);
wcout.rdbuf(&fbout);
fbout.sputc(L'a');
sleep(2);
// NB: fbout is *not* destroyed here!
exit(0);
}
wfilebuf fbin;
fbin.open(name, ios_base::in);
sleep(2);
wfilebuf::int_type c = fbin.sbumpc();
VERIFY( c != wfilebuf::traits_type::eof() );
VERIFY( c == wfilebuf::traits_type::to_int_type(L'a') );
fbin.close();
}
int
main()
{
test07();
return 0;
}

View File

@ -0,0 +1,42 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2000, 2001, 2002, 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.
#include <iostream>
#include <testsuite_hooks.h>
// libstdc++/7744
void test11()
{
bool test = true;
std::ios::sync_with_stdio(false);
std::wcout << "Type in the characters 'abc' and press <ENTER>: ";
std::wcin.peek();
// The number of unread characters should be 4 (a, b, c, \\n)
VERIFY( 4 == std::wcin.rdbuf()->in_avail() );
}
int
main()
{
test11();
return 0;
}

View File

@ -0,0 +1 @@
abc

View File

@ -0,0 +1,51 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2003 Free Software Foundation
//
// 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.
// 27.3 - Standard iostream objects p 2
#include <iostream>
#include <testsuite_hooks.h>
void test02()
{
bool test = true;
// 27.3 - Standard iostream objects p 2
// The objects are not destroyed during program execution.
void* p1 = &std::wcout;
void* p2 = &std::wcin;
void* p3 = &std::wcerr;
void* p4 = &std::wclog;
std::ios_base::sync_with_stdio(false);
void* p1s = &std::wcout;
void* p2s = &std::wcin;
void* p3s = &std::wcerr;
void* p4s = &std::wclog;
VERIFY( p1 == p1s );
VERIFY( p2 == p2s );
VERIFY( p3 == p3s );
VERIFY( p4 == p4s );
}
int main(void)
{
test02();
return 0;
}

View File

@ -0,0 +1,57 @@
// 2003-04-30 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <testsuite_hooks.h>
#include <iostream>
#include <cstdio>
void test01()
{
using namespace std;
bool test = true;
const char* name = "tmp_9520";
FILE* file = fopen(name, "w");
for (int i = 1; i < 256; ++i)
putc(static_cast<unsigned char>(i), file);
fclose(file);
locale loc (__gnu_cxx_test::try_named_locale("de_DE.ISO-8859-15@euro"));
locale::global(loc); // Set locale for stdin
freopen(name, "r", stdin);
wcin.imbue(loc);
for (int j = 1; j < 256; ++j)
{
wint_t c1 = wcin.rdbuf()->sgetc();
VERIFY( c1 != WEOF );
wint_t c2 = wcin.rdbuf()->sbumpc();
VERIFY( c1 == c2 );
}
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,85 @@
// 2003-04-30 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <testsuite_hooks.h>
#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
// Check that wcin.rdbuf()->sputbackc() puts characters back to stdin.
// If wcin.rdbuf() is a filebuf, this succeeds when stdin is a regular
// file, but fails otherwise, hence the named fifo.
void test01()
{
using namespace std;
bool test = true;
const char* name = "tmp_fifo5";
signal(SIGPIPE, SIG_IGN);
unlink(name);
mkfifo(name, S_IRWXU);
int child = fork();
VERIFY( child != -1 );
if (child == 0)
{
sleep(1);
FILE* file = fopen(name, "w");
fputs("Whatever\n", file);
fflush(file);
sleep(2);
fclose(file);
exit(0);
}
freopen(name, "r", stdin);
sleep(2);
wint_t c1 = fgetwc(stdin);
VERIFY( c1 != WEOF );
wint_t c2 = wcin.rdbuf()->sputbackc(L'a');
VERIFY( c2 != WEOF );
VERIFY( c2 == L'a' );
wint_t c3 = fgetwc(stdin);
VERIFY( c3 != WEOF );
VERIFY( c3 == c2 );
wint_t c4 = ungetwc(L'b', stdin);
VERIFY( c4 != WEOF );
VERIFY( c4 == L'b' );
wint_t c5 = wcin.rdbuf()->sgetc();
VERIFY( c5 != WEOF );
VERIFY( c5 == c4 );
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,48 @@
// 2003-04-30 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <testsuite_hooks.h>
#include <cstdio>
#include <iostream>
#include <cwchar>
void test02()
{
using namespace std;
bool test = true;
wint_t c1 = fgetwc(stdin);
wint_t c2 = wcin.rdbuf()->sputbackc(c1);
VERIFY( c2 == c1 );
wint_t c3 = fgetwc(stdin);
VERIFY( c3 == c1 );
ungetwc(c3, stdin);
wint_t c4 = wcin.rdbuf()->sgetc();
VERIFY( c4 == c3 );
}
int main()
{
test02();
return 0;
}

View File

@ -0,0 +1 @@
For what you dream of

View File

@ -0,0 +1,42 @@
// 2003-04-30 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <testsuite_hooks.h>
#include <iostream>
#include <cstdio>
#include <cwchar>
// Check that operations on wcout can be mixed with wide operations
// on stdout.
void test01()
{
bool test = true;
std::wcout << L"Hello, ";
VERIFY( std::fwide(stdout, 0) >= 0 );
int ret = std::fputws(L"world!\n", stdout);
VERIFY( ret >= 0 );
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,65 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// 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.
#include <iostream>
#include <locale>
#include <string>
#include <cwchar>
#include <cwctype>
#include <iterator>
#include <algorithm>
#include <testsuite_hooks.h>
// This tests the handling of multibyte characters by wcin and wcout.
void test09()
{
using namespace std;
locale loc("");
locale::global(loc);
wcout.imbue(loc);
wcin.imbue(loc);
wcout << L"Current locale is: \'" << loc.name().c_str() << L"\'\n";
wcout << L"Please enter your name: ";
wstring str;
getline(wcin, str);
wcout << str << endl;
wcout << str.size() << endl;
transform(str.begin(), str.end(),
ostream_iterator<wchar_t, wchar_t>(wcout), towupper);
wcout << endl;
transform(str.begin(), str.end(),
ostream_iterator<wchar_t, wchar_t>(wcout), towlower);
wcout << endl << hex << showbase;
copy(str.begin(), str.end(),
ostream_iterator<wint_t, wchar_t>(wcout, L" "));
wcout << endl;
}
int main()
{
test09();
return 0;
}

View File

@ -0,0 +1 @@
JOHN HUME and DAVID TRIMBLE

View File

@ -0,0 +1,64 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2003 Free Software Foundation
//
// 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.
#include <ext/stdio_sync_filebuf.h>
#include <testsuite_hooks.h>
void test01()
{
using namespace std;
bool test = true;
const char* c_lit = "black pearl jasmine tea";
int size = strlen(c_lit);
const char* name = "stdiobuf-1.txt";
FILE* fout = fopen(name, "w");
fwrite(c_lit, 1, size, fout);
fclose(fout);
FILE* fin = fopen(name, "r");
__gnu_cxx::stdio_sync_filebuf<char> sbuf(fin);
VERIFY( sbuf.sgetc() == c_lit[0] );
VERIFY( getc(fin) == c_lit[0] );
VERIFY( sbuf.sgetc() == c_lit[1] );
VERIFY( sbuf.sbumpc() == c_lit[1] );
VERIFY( ungetc('Z', fin) == 'Z' );
VERIFY( sbuf.sbumpc() == 'Z' );
VERIFY( getc(fin) == c_lit[2] );
VERIFY( sbuf.sputbackc('X') == 'X' );
VERIFY( getc(fin) == 'X' );
char buf[5];
memset(buf, 'x', 5);
VERIFY( sbuf.sgetn(buf, 5) == 5 );
VERIFY( !memcmp(buf, c_lit + 3, 5) );
VERIFY( getc(fin) == c_lit[8] );
VERIFY( sbuf.sungetc() == EOF );
fclose(fin);
}
int main ()
{
test01();
return 0;
}

View File

@ -0,0 +1,65 @@
// 2003-05-01 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2003 Free Software Foundation
//
// 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.
#include <ext/stdio_sync_filebuf.h>
#include <testsuite_hooks.h>
void test01()
{
using namespace std;
bool test = true;
const char* c_lit = "black pearl jasmine tea";
const wchar_t* w_lit = L"black pearl jasmine tea";
int size = strlen(c_lit);
const char* name = "stdiobuf-1.txt";
FILE* fout = fopen(name, "w");
fwrite(c_lit, 1, size, fout);
fclose(fout);
FILE* fin = fopen(name, "r");
__gnu_cxx::stdio_sync_filebuf<wchar_t> wsbuf(fin);
VERIFY( wsbuf.sgetc() == w_lit[0] );
VERIFY( getwc(fin) == w_lit[0] );
VERIFY( wsbuf.sgetc() == w_lit[1] );
VERIFY( wsbuf.sbumpc() == w_lit[1] );
VERIFY( ungetwc(L'Z', fin) == L'Z' );
VERIFY( wsbuf.sbumpc() == L'Z' );
VERIFY( getwc(fin) == w_lit[2] );
VERIFY( wsbuf.sputbackc(L'X') == L'X' );
VERIFY( getwc(fin) == L'X' );
wchar_t buf[5];
wmemset(buf, 0xdeadbeef, 5);
VERIFY( wsbuf.sgetn(buf, 5) == 5 );
VERIFY( !wmemcmp(buf, w_lit + 3, 5) );
VERIFY( getwc(fin) == w_lit[8] );
VERIFY( wsbuf.sungetc() == WEOF );
fclose(fin);
}
int main ()
{
test01();
return 0;
}