re PR libstdc++/8258 (basic_istream::readsome() with default buffer change stream state to ios_base::eofbit)

2002-11-05  Benjamin Kosnik  <bkoz@redhat.com>

	PR libstdc++/8258
	* include/bits/istream.tcc (istream::readsome): Don't set eofbit
	for null buffer.
	(istream::operator>>(_CharT*)): Use traits_type.
	(istream::ws): Same.
	(istream::operator>>(string)): Same.
	* testsuite/27_io/istream_unformatted.cc (test11): Add.

From-SVN: r58840
This commit is contained in:
Benjamin Kosnik 2002-11-05 23:46:22 +00:00
parent 81646a3157
commit 112615e7d3
3 changed files with 43 additions and 9 deletions

View File

@ -1,3 +1,13 @@
2002-11-05 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/8258
* include/bits/istream.tcc (istream::readsome): Don't set eofbit
for null buffer.
(istream::operator>>(_CharT*)): Use traits_type.
(istream::ws): Same.
(istream::operator>>(string)): Same.
* testsuite/27_io/istream_unformatted.cc (test11): Add.
2002-11-05 Paolo Carlini <pcarlini@unitus.it> 2002-11-05 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/8466 PR libstdc++/8466
@ -11,7 +21,7 @@
* configure.target (hppa*): Define cpu_include_dir. * configure.target (hppa*): Define cpu_include_dir.
* config/os/hpux/os_defines.h (_GLIBCPP_INST_ATOMICITY_LOCK): Define. * config/os/hpux/os_defines.h (_GLIBCPP_INST_ATOMICITY_LOCK): Define.
* src/misc-inst.cc (std): Instantiate atomicity lock when * src/misc-inst.cc: Instantiate atomicity lock when
_GLIBCPP_INST_ATOMICITY_LOCK is defined. _GLIBCPP_INST_ATOMICITY_LOCK is defined.
* config/cpu/hppa/atomicity.h: New file. * config/cpu/hppa/atomicity.h: New file.

View File

@ -811,8 +811,9 @@ namespace std
{ {
try try
{ {
// Cannot compare int_type with streamsize generically.
streamsize __num = this->rdbuf()->in_avail(); streamsize __num = this->rdbuf()->in_avail();
if (__num > 0) if (__num >= 0)
{ {
__num = min(__num, __n); __num = min(__num, __n);
if (__num) if (__num)
@ -1034,13 +1035,14 @@ namespace std
int_type __c = __sb->sgetc(); int_type __c = __sb->sgetc();
while (__extracted < __num - 1 while (__extracted < __num - 1
&& __c != __eof && !__ctype.is(ctype_base::space, __c)) && !_Traits::eq_int_type(__c, __eof)
&& !__ctype.is(ctype_base::space, __c))
{ {
*__s++ = __c; *__s++ = __c;
++__extracted; ++__extracted;
__c = __sb->snextc(); __c = __sb->snextc();
} }
if (__c == __eof) if (_Traits::eq_int_type(__c, __eof))
__in.setstate(ios_base::eofbit); __in.setstate(ios_base::eofbit);
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
@ -1078,9 +1080,11 @@ namespace std
__streambuf_type* __sb = __in.rdbuf(); __streambuf_type* __sb = __in.rdbuf();
__int_type __c = __sb->sgetc(); __int_type __c = __sb->sgetc();
while (__c != __eof && __ctype.is(ctype_base::space, __c)) while (!_Traits::eq_int_type(__c, __eof)
&& __ctype.is(ctype_base::space, __c))
__c = __sb->snextc(); __c = __sb->snextc();
if (__c == __eof)
if (_Traits::eq_int_type(__c, __eof))
__in.setstate(ios_base::eofbit); __in.setstate(ios_base::eofbit);
return __in; return __in;
@ -1114,13 +1118,14 @@ namespace std
__int_type __c = __sb->sgetc(); __int_type __c = __sb->sgetc();
while (__extracted < __n while (__extracted < __n
&& __c != __eof && !__ctype.is(ctype_base::space, __c)) && !_Traits::eq_int_type(__c, __eof)
&& !__ctype.is(ctype_base::space, __c))
{ {
__str += _Traits::to_char_type(__c); __str += _Traits::to_char_type(__c);
++__extracted; ++__extracted;
__c = __sb->snextc(); __c = __sb->snextc();
} }
if (__c == __eof) if (_Traits::eq_int_type(__c, __eof))
__in.setstate(ios_base::eofbit); __in.setstate(ios_base::eofbit);
__in.width(0); __in.width(0);
} }

View File

@ -551,6 +551,25 @@ test10()
VERIFY( test ); VERIFY( test );
} }
// libstdc++/8258
class mybuf : public std::basic_streambuf<char>
{ };
void test11()
{
bool test = true;
using namespace std;
char arr[10];
mybuf sbuf;
basic_istream<char, char_traits<char> > istr(&sbuf);
VERIFY(istr.rdstate() == ios_base::goodbit);
VERIFY(istr.readsome(arr, 10) == 0);
VERIFY(istr.rdstate() == ios_base::goodbit);
}
int int
main() main()
{ {
@ -564,6 +583,6 @@ main()
test08(); test08();
test09(); test09();
test10(); test10();
test11();
return 0; return 0;
} }