mirror of git://gcc.gnu.org/git/gcc.git
re PR libstdc++/12593 (Resolution of DR 91 (WP) still unimplemented)
2003-11-22 Paolo Carlini <pcarlini@suse.de> PR libstdc++/12593 * include/bits/istream.tcc (operator>>(basic_string<>&), getline(basic_string<>&)): Implement resolution of DR 91 [WP]; fix some minor issues with the exit conditions. * docs/html/ext/howto.html: Add an entry for DR 91. From-SVN: r73835
This commit is contained in:
parent
13418b4003
commit
1a311979dd
|
|
@ -1,3 +1,11 @@
|
||||||
|
2003-11-22 Paolo Carlini <pcarlini@suse.de>
|
||||||
|
|
||||||
|
PR libstdc++/12593
|
||||||
|
* include/bits/istream.tcc (operator>>(basic_string<>&),
|
||||||
|
getline(basic_string<>&)): Implement resolution of DR 91 [WP];
|
||||||
|
fix some minor issues with the exit conditions.
|
||||||
|
* docs/html/ext/howto.html: Add an entry for DR 91.
|
||||||
|
|
||||||
2003-11-21 Paolo Carlini <pcarlini@suse.de>
|
2003-11-21 Paolo Carlini <pcarlini@suse.de>
|
||||||
|
|
||||||
* config/locale/gnu/monetary_members.cc
|
* config/locale/gnu/monetary_members.cc
|
||||||
|
|
|
||||||
|
|
@ -526,6 +526,15 @@
|
||||||
replaced by <code>isspace(c,is.getloc())</code>.
|
replaced by <code>isspace(c,is.getloc())</code>.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
|
<dt><a href="lwg-defects.html#91">91</a>:
|
||||||
|
<em>Description of operator>> and getline() for string<>
|
||||||
|
might cause endless loop</em>
|
||||||
|
</dt>
|
||||||
|
<dd>They behave as a formatted input function and as an unformatted
|
||||||
|
input function, respectively (except that <code>getline</code> is
|
||||||
|
not required to set <code>gcount</code>).
|
||||||
|
</dd>
|
||||||
|
|
||||||
<dt><a href="lwg-defects.html#109">109</a>:
|
<dt><a href="lwg-defects.html#109">109</a>:
|
||||||
<em>Missing binders for non-const sequence elements</em>
|
<em>Missing binders for non-const sequence elements</em>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
|
||||||
|
|
@ -1102,32 +1102,46 @@ namespace std
|
||||||
typedef typename __istream_type::__ctype_type __ctype_type;
|
typedef typename __istream_type::__ctype_type __ctype_type;
|
||||||
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
|
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
|
||||||
typedef typename __string_type::size_type __size_type;
|
typedef typename __string_type::size_type __size_type;
|
||||||
__size_type __extracted = 0;
|
|
||||||
|
|
||||||
|
__size_type __extracted = 0;
|
||||||
typename __istream_type::sentry __cerb(__in, false);
|
typename __istream_type::sentry __cerb(__in, false);
|
||||||
if (__cerb)
|
if (__cerb)
|
||||||
{
|
{
|
||||||
__str.erase();
|
try
|
||||||
streamsize __w = __in.width();
|
|
||||||
__size_type __n;
|
|
||||||
__n = __w > 0 ? static_cast<__size_type>(__w) : __str.max_size();
|
|
||||||
|
|
||||||
const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
|
|
||||||
const __int_type __eof = _Traits::eof();
|
|
||||||
__streambuf_type* __sb = __in.rdbuf();
|
|
||||||
__int_type __c = __sb->sgetc();
|
|
||||||
|
|
||||||
while (__extracted < __n
|
|
||||||
&& !_Traits::eq_int_type(__c, __eof)
|
|
||||||
&& !__ct.is(ctype_base::space, _Traits::to_char_type(__c)))
|
|
||||||
{
|
{
|
||||||
__str += _Traits::to_char_type(__c);
|
__str.erase();
|
||||||
++__extracted;
|
streamsize __w = __in.width();
|
||||||
__c = __sb->snextc();
|
__size_type __n;
|
||||||
|
__n = __w > 0 ? static_cast<__size_type>(__w) : __str.max_size();
|
||||||
|
|
||||||
|
const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
|
||||||
|
const __int_type __eof = _Traits::eof();
|
||||||
|
__streambuf_type* __sb = __in.rdbuf();
|
||||||
|
__int_type __c = __sb->sgetc();
|
||||||
|
|
||||||
|
while (__extracted < __n
|
||||||
|
&& !_Traits::eq_int_type(__c, __eof)
|
||||||
|
&& !__ct.is(ctype_base::space, _Traits::to_char_type(__c)))
|
||||||
|
{
|
||||||
|
__str += _Traits::to_char_type(__c);
|
||||||
|
++__extracted;
|
||||||
|
__c = __sb->snextc();
|
||||||
|
}
|
||||||
|
if (_Traits::eq_int_type(__c, __eof))
|
||||||
|
__in.setstate(ios_base::eofbit);
|
||||||
|
__in.width(0);
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
|
// 91. Description of operator>> and getline() for string<>
|
||||||
|
// might cause endless loop
|
||||||
|
// 27.6.1.2.1 Common requirements.
|
||||||
|
// Turn this on without causing an ios::failure to be thrown.
|
||||||
|
__in.setstate(ios_base::badbit);
|
||||||
|
if ((__in.exceptions() & ios_base::badbit) != 0)
|
||||||
|
__throw_exception_again;
|
||||||
}
|
}
|
||||||
if (_Traits::eq_int_type(__c, __eof))
|
|
||||||
__in.setstate(ios_base::eofbit);
|
|
||||||
__in.width(0);
|
|
||||||
}
|
}
|
||||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
// 211. operator>>(istream&, string&) doesn't set failbit
|
// 211. operator>>(istream&, string&) doesn't set failbit
|
||||||
|
|
@ -1149,31 +1163,44 @@ namespace std
|
||||||
typedef typename __string_type::size_type __size_type;
|
typedef typename __string_type::size_type __size_type;
|
||||||
|
|
||||||
__size_type __extracted = 0;
|
__size_type __extracted = 0;
|
||||||
|
const __size_type __n = __str.max_size();
|
||||||
bool __testdelim = false;
|
bool __testdelim = false;
|
||||||
typename __istream_type::sentry __cerb(__in, true);
|
typename __istream_type::sentry __cerb(__in, true);
|
||||||
if (__cerb)
|
if (__cerb)
|
||||||
{
|
{
|
||||||
__str.erase();
|
try
|
||||||
__size_type __n = __str.max_size();
|
|
||||||
|
|
||||||
__int_type __idelim = _Traits::to_int_type(__delim);
|
|
||||||
__streambuf_type* __sb = __in.rdbuf();
|
|
||||||
__int_type __c = __sb->sbumpc();
|
|
||||||
const __int_type __eof = _Traits::eof();
|
|
||||||
__testdelim = _Traits::eq_int_type(__c, __idelim);
|
|
||||||
|
|
||||||
while (__extracted <= __n && !_Traits::eq_int_type(__c, __eof)
|
|
||||||
&& !__testdelim)
|
|
||||||
{
|
{
|
||||||
__str += _Traits::to_char_type(__c);
|
__str.erase();
|
||||||
++__extracted;
|
__int_type __idelim = _Traits::to_int_type(__delim);
|
||||||
__c = __sb->sbumpc();
|
__streambuf_type* __sb = __in.rdbuf();
|
||||||
|
__int_type __c = __sb->sbumpc();
|
||||||
|
const __int_type __eof = _Traits::eof();
|
||||||
__testdelim = _Traits::eq_int_type(__c, __idelim);
|
__testdelim = _Traits::eq_int_type(__c, __idelim);
|
||||||
|
|
||||||
|
while (!_Traits::eq_int_type(__c, __eof) && !__testdelim
|
||||||
|
&& __extracted < __n)
|
||||||
|
{
|
||||||
|
__str += _Traits::to_char_type(__c);
|
||||||
|
++__extracted;
|
||||||
|
__c = __sb->sbumpc();
|
||||||
|
__testdelim = _Traits::eq_int_type(__c, __idelim);
|
||||||
|
}
|
||||||
|
if (_Traits::eq_int_type(__c, __eof))
|
||||||
|
__in.setstate(ios_base::eofbit);
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
|
// 91. Description of operator>> and getline() for string<>
|
||||||
|
// might cause endless loop
|
||||||
|
// 27.6.1.2.1 Common requirements.
|
||||||
|
// Turn this on without causing an ios::failure to be thrown.
|
||||||
|
__in.setstate(ios_base::badbit);
|
||||||
|
if ((__in.exceptions() & ios_base::badbit) != 0)
|
||||||
|
__throw_exception_again;
|
||||||
}
|
}
|
||||||
if (_Traits::eq_int_type(__c, __eof))
|
|
||||||
__in.setstate(ios_base::eofbit);
|
|
||||||
}
|
}
|
||||||
if (!__extracted && !__testdelim)
|
if ((!__extracted && !__testdelim) || __extracted == __n)
|
||||||
__in.setstate(ios_base::failbit);
|
__in.setstate(ios_base::failbit);
|
||||||
return __in;
|
return __in;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue