[multiple changes]

2000-07-07   brent verner  <brent@rcfile.org>

	* testsuite/27_io/istream_unformatted.cc (test05): New test.

2000-07-07  Benjamin Kosnik  <bkoz@gnu.org>

	* bits/istream.tcc (istream::getline): Minor tweaks.

From-SVN: r34913
This commit is contained in:
Benjamin Kosnik 2000-07-07 21:21:57 +00:00
parent dd1ee41e67
commit 75555da78d
3 changed files with 129 additions and 33 deletions

View File

@ -1,3 +1,11 @@
2000-07-07 brent verner <brent@rcfile.org>
* testsuite/27_io/istream_unformatted.cc (test05): New test.
2000-07-07 Benjamin Kosnik <bkoz@gnu.org>
* bits/istream.tcc (istream::getline): Minor tweaks.
2000-07-07 Phil Edwards <pme@sourceware.cygnus.com>
* docs/download.html: Mention gcc_update.

View File

@ -503,10 +503,9 @@ namespace std {
sentry __cerb(*this, true);
if (__cerb)
{
const int_type __eof = traits_type::eof();
int_type __bufval;
try {
__bufval = this->rdbuf()->sbumpc();
const int_type __eof = traits_type::eof();
int_type __bufval = this->rdbuf()->sbumpc();
// 27.6.1.1 paragraph 3
if (__bufval != __eof)
{
@ -537,10 +536,10 @@ namespace std {
if (__cerb && __n > 1)
{
try {
int_type __idelim = traits_type::to_int_type(__delim);
const int_type __idelim = traits_type::to_int_type(__delim);
const int_type __eof = traits_type::eof();
__streambuf_type* __sb = this->rdbuf();
int_type __c = __sb->sbumpc();
const int_type __eof = traits_type::eof();
bool __testdelim = __c == __idelim;
bool __testeof = __c == __eof;
@ -580,12 +579,12 @@ namespace std {
sentry __cerb(*this, true);
if (__cerb)
{
__streambuf_type* __this_sb = this->rdbuf();
int_type __c;
__streambuf_type* __this_sb = this->rdbuf();
try {
int_type __idelim = traits_type::to_int_type(__delim);
__c = __this_sb->sbumpc();
const int_type __idelim = traits_type::to_int_type(__delim);
const int_type __eof = traits_type::eof();
__c = __this_sb->sbumpc();
bool __testdelim = __c == __idelim;
bool __testeof = __c == __eof;
bool __testput = true;
@ -627,30 +626,49 @@ namespace std {
if (__cerb)
{
try {
int_type __idelim = traits_type::to_int_type(__delim);
__streambuf_type* __sb = this->rdbuf();
int_type __c = __sb->sbumpc();
const int_type __idelim = traits_type::to_int_type(__delim);
const int_type __eof = traits_type::eof();
bool __testdelim = __c == __idelim;
bool __testeof = __c == __eof;
__streambuf_type* __sb = this->rdbuf();
bool __testdelim = false;
bool __testeof = false;
while (_M_gcount < __n - 1 && !__testeof && !__testdelim)
// This is completely idiotic, but attempts to recreate
// the smoke-filled air of the committee meeting where
// getline was defined. It's unspecified for __n == 1,
// what happens to the extracted char if it is not a
// delimiter or EOF. Assume it's not extracted, for the
// time being. . .
if (__n == 1)
{
int_type __c = __sb->sgetc();
__testdelim = __c == __idelim;
__testeof = __c == __eof;
if (__testdelim)
{
++_M_gcount;
__sb->sbumpc();
}
}
else
{
while (_M_gcount < __n - 1 && !__testdelim && !__testeof)
{
int_type __c = __sb->sbumpc();
__testdelim = __c == __idelim;
__testeof = __c == __eof;
if (__testdelim)
++_M_gcount;
else if (!__testeof)
{
*__s++ = traits_type::to_char_type(__c);
++_M_gcount;
__c = __sb->sbumpc();
__testeof = __c == __eof;
__testdelim = __c == __idelim;
}
if (_M_gcount == __n - 1 && !__testeof && !__testdelim)
{
__sb->sputbackc(traits_type::to_char_type(__c));
this->setstate(ios_base::failbit);
}
if (__testdelim)
++_M_gcount;
}
if (__testeof)
this->setstate(ios_base::eofbit);
else if (!__testdelim && _M_gcount == __n - 1)
this->setstate(ios_base::failbit);
}
catch(exception& __fail){
// 27.6.1.3 paragraph 1
@ -661,7 +679,7 @@ namespace std {
}
}
*__s = char_type(NULL);
if (!_M_gcount || _M_gcount == __n - 1)
if (!_M_gcount)
this->setstate(ios_base::failbit);
return *this;
}
@ -676,10 +694,10 @@ namespace std {
if (__cerb && __n > 0)
{
try {
int_type __idelim = traits_type::to_int_type(__delim);
const int_type __idelim = traits_type::to_int_type(__delim);
const int_type __eof = traits_type::eof();
__streambuf_type* __sb = this->rdbuf();
int_type __c = __sb->sbumpc();
const int_type __eof = traits_type::eof();
bool __testdelim = __c == __idelim;
bool __testeof = __c == __eof;
@ -743,9 +761,9 @@ namespace std {
if (__n > 0)
{
try {
const int_type __eof = traits_type::eof();
__streambuf_type* __sb = this->rdbuf();
int_type __c = __sb->sbumpc();
const int_type __eof = traits_type::eof();
bool __testeof = __c == __eof;
while (_M_gcount < __n - 1 && !__testeof)
@ -847,12 +865,12 @@ namespace std {
basic_istream<_CharT, _Traits>::
unget(void)
{
const int_type __eof = traits_type::eof();
_M_gcount = 0;
sentry __cerb(*this, true);
if (__cerb)
{
try {
const int_type __eof = traits_type::eof();
__streambuf_type* __sb = this->rdbuf();
if (!__sb || __eof == __sb->sungetc())
this->setstate(ios_base::badbit);

View File

@ -24,7 +24,10 @@
#include <sstream>
#include <fstream>
#ifdef DEBUG_ASSERT
#include <assert.h>
#include <cassert>
# define VERIFY(fn) assert(fn)
#else
# define VERIFY(fn)
#endif
bool test01() {
@ -317,7 +320,7 @@ bool test03(void)
}
// http://sourceware.cygnus.com/ml/libstdc++/2000-q1/msg00177.html
void test06()
void test04()
{
bool test = true;
@ -345,12 +348,79 @@ void test06()
#endif
}
// http://sourceware.cygnus.com/ml/libstdc++/2000-07/msg00003.html
bool test05()
{
const char* charray = "
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
aaaaaaaaaaa
aaaaaaaaaaaa
aaaaaaaaaaaaa
aaaaaaaaaaaaaa
";
bool test = true;
const std::streamsize it = 5;
std::streamsize br = 0;
char tmp[it];
std::stringbuf sb(charray, std::ios_base::in);
std::istream ifs(&sb);
std::streamsize blen = strlen(charray);
VERIFY(ifs);
while(ifs.getline(tmp, it) || ifs.gcount())
{
br += ifs.gcount();
if(ifs.eof())
{
// Just sanity checks to make sure we've extracted the same
// number of chars that were in the file.
VERIFY(br == blen);
// Also, we should only set the failbit if we could
// _extract_ no chars from the stream, i.e. the first read
// returned EOF.
VERIFY(ifs.fail() && ifs.gcount() == 0);
}
else if(ifs.fail())
{
// either
// -> extracted no characters
// or
// -> n - 1 characters are stored
VERIFY(strlen(tmp) == it - 1);
ifs.clear(ifs.rdstate() & ~std::ios::failbit);
VERIFY(ifs);
continue;
}
else
{
// -> strlen(__s) < n - 1
// -> delimiter was seen -> gcount() > strlen(__s)
VERIFY(ifs.gcount() > strlen(tmp));
VERIFY(it - 1 > strlen(tmp));
continue;
}
}
return 0;
}
int main()
{
test01();
test02();
test03();
test06();
test04();
test05();
return 0;
}