iostream.cc: Add missing calls to isfx and setup a cleanup region for the locked stream.

* iostream.cc: Add missing calls to isfx and setup a cleanup
	region for the locked stream.
	* iostream.h: Likewise.
	* isgetline.cc: Likewise.
	* isgetsb.cc: Likewise.
	* isscan.cc: Likewise.

From-SVN: r28573
This commit is contained in:
Andreas Schwab 1999-08-07 06:02:05 +00:00 committed by Jeff Law
parent 80832cf27b
commit ff76d1ee86
6 changed files with 94 additions and 7 deletions

View File

@ -1,3 +1,12 @@
1999-08-07 Andreas Schwab <schwab@suse.de>
* iostream.cc: Add missing calls to isfx and setup a cleanup
region for the locked stream.
* iostream.h: Likewise.
* isgetline.cc: Likewise.
* isgetsb.cc: Likewise.
* isscan.cc: Likewise.
Mon Jun 28 09:25:23 1999 Hans-Peter Nilsson <hp@bitrange.com>
* configure.in (post-target): Use "$(topsrcdir)", not "$(srcdir)/..".

View File

@ -71,6 +71,8 @@ int skip_ws(streambuf* sb)
istream& istream::get(char& c)
{
if (ipfx1()) {
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
int ch = _strbuf->sbumpc();
if (ch == EOF) {
set(ios::eofbit|ios::failbit);
@ -80,6 +82,8 @@ istream& istream::get(char& c)
c = (char)ch;
_gcount = 1;
}
isfx();
_IO_cleanup_region_end (0);
}
else
_gcount = 0;
@ -102,10 +106,12 @@ istream& istream::ignore(int n /* = 1 */, int delim /* = EOF */)
{
_gcount = 0;
if (ipfx1()) {
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
register streambuf* sb = _strbuf;
if (delim == EOF) {
_gcount = sb->ignore(n);
return *this;
goto unlock;
}
for (;;) {
#if 0
@ -122,6 +128,9 @@ istream& istream::ignore(int n /* = 1 */, int delim /* = EOF */)
if (ch == delim)
break;
}
unlock:
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}
@ -129,9 +138,13 @@ istream& istream::ignore(int n /* = 1 */, int delim /* = EOF */)
istream& istream::read(char *s, streamsize n)
{
if (ipfx1()) {
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
_gcount = _strbuf->sgetn(s, n);
if (_gcount != n)
set(ios::failbit|ios::eofbit);
isfx();
_IO_cleanup_region_end (0);
}
else
_gcount = 0;
@ -184,11 +197,15 @@ streampos istream::tellg()
istream& istream::operator>>(char& c)
{
if (ipfx0()) {
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
int ch = _strbuf->sbumpc();
if (ch == EOF)
set(ios::eofbit|ios::failbit);
else
c = (char)ch;
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}
@ -200,6 +217,8 @@ istream::operator>> (char* ptr)
int w = width(0);
if (ipfx0())
{
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
register streambuf* sb = _strbuf;
for (;;)
{
@ -219,6 +238,8 @@ istream::operator>> (char* ptr)
}
if (p == ptr)
set(ios::failbit);
isfx();
_IO_cleanup_region_end (0);
}
*p = '\0';
return *this;
@ -234,6 +255,9 @@ static int read_int(istream& stream, unsigned LONGEST& val, int& neg)
{
if (!stream.ipfx0())
return 0;
int retval;
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
stream._strbuf);
register streambuf* sb = stream.rdbuf();
int base = 10;
int ndigits = 0;
@ -254,7 +278,7 @@ static int read_int(istream& stream, unsigned LONGEST& val, int& neg)
ch = sb->sbumpc();
if (ch == EOF) {
val = 0;
return 1;
goto unlock;
}
if (ch == 'x' || ch == 'X') {
base = 16;
@ -290,19 +314,26 @@ static int read_int(istream& stream, unsigned LONGEST& val, int& neg)
if (ndigits == 0)
goto fail;
else
return 1;
goto unlock;
}
ndigits++;
val = base * val + digit;
ch = sb->sbumpc();
}
return 1;
unlock:
retval = 1;
goto out;
fail:
stream.set(ios::failbit);
return 0;
retval = 0;
goto out;
eof_fail:
stream.set(ios::failbit|ios::eofbit);
return 0;
retval = 0;
out:
stream.isfx();
_IO_cleanup_region_end (0);
return retval;
}
#define READ_INT(TYPE) \
@ -334,6 +365,8 @@ istream& istream::operator>>(long double& x)
{
if (ipfx0())
{
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
#if _G_HAVE_LONG_DOUBLE_IO
scan("%Lg", &x);
#else
@ -341,6 +374,8 @@ istream& istream::operator>>(long double& x)
scan("%lg", &y);
x = y;
#endif
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}
@ -348,20 +383,34 @@ istream& istream::operator>>(long double& x)
istream& istream::operator>>(double& x)
{
if (ipfx0())
{
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
scan("%lg", &x);
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}
istream& istream::operator>>(float& x)
{
if (ipfx0())
{
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
scan("%g", &x);
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}
istream& istream::operator>>(register streambuf* sbuf)
{
if (ipfx0()) {
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
register streambuf* inbuf = rdbuf();
// FIXME: Should optimize!
for (;;) {
@ -375,6 +424,8 @@ istream& istream::operator>>(register streambuf* sbuf)
break;
}
}
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}
@ -789,8 +840,8 @@ ostream& ostream::operator<<(const char *s)
if (flags() & ios::left && padding > 0) // Left adjustment.
if (_IO_padn(sbuf, fill_char, padding) != padding)
set(ios::badbit);
osfx();
failed:
osfx();
_IO_cleanup_region_end (0);
}
return *this;

View File

@ -173,6 +173,7 @@ protected:
int get() { if (!ipfx1()) return EOF;
else { int ch = _strbuf->sbumpc();
if (ch == EOF) set(ios::eofbit);
isfx();
return ch;
} }
int peek();

View File

@ -37,6 +37,8 @@ istream& istream::getline(char* buf, int len, char delim)
int ch;
if (ipfx1())
{
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
streambuf *sb = rdbuf();
_gcount = _IO_getline_info(sb, buf, len - 1, delim, -1, &ch);
if (ch != EOF)
@ -48,6 +50,8 @@ istream& istream::getline(char* buf, int len, char delim)
set(ios::failbit);
sb->sungetc(); // Leave delimiter unread.
}
isfx();
_IO_cleanup_region_end (0);
}
else
ch = EOF;
@ -67,11 +71,15 @@ istream& istream::get(char* buf, int len, char delim)
}
if (ipfx1())
{
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
streambuf *sbuf = rdbuf();
int ch;
_gcount = _IO_getline_info(sbuf, buf, len - 1, delim, -1, &ch);
if (_gcount == 0 && ch == EOF)
set(ios::failbit|ios::eofbit);
isfx();
_IO_cleanup_region_end (0);
}
buf[_gcount] = '\0';
return *this;
@ -123,6 +131,8 @@ char *_sb_readline (streambuf *sb, long& total, char terminator)
istream& istream::gets(char **s, char delim /* = '\n' */)
{
if (ipfx1()) {
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
long size = 0;
streambuf *sb = rdbuf();
*s = _sb_readline (sb, size, delim);
@ -132,6 +142,8 @@ istream& istream::gets(char **s, char delim /* = '\n' */)
if (_gcount == 0)
set(ios::failbit);
}
isfx();
_IO_cleanup_region_end (0);
}
else {
_gcount = 0;

View File

@ -31,6 +31,8 @@ istream& istream::get(streambuf& sb, char delim /* = '\n' */)
_gcount = 0;
if (ipfx1())
{
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
register streambuf* isb = rdbuf();
for (;;)
{
@ -54,6 +56,8 @@ istream& istream::get(streambuf& sb, char delim /* = '\n' */)
if (delimp != NULL)
break;
}
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}

View File

@ -29,10 +29,14 @@ the executable file might be covered by the GNU General Public License. */
istream& istream::scan(const char *format ...)
{
if (ipfx0()) {
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
va_list ap;
va_start(ap, format);
_strbuf->vscan(format, ap, this);
va_end(ap);
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}
@ -40,6 +44,12 @@ istream& istream::scan(const char *format ...)
istream& istream::vscan(const char *format, _IO_va_list args)
{
if (ipfx0())
{
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
_strbuf);
_strbuf->vscan(format, args, this);
isfx();
_IO_cleanup_region_end (0);
}
return *this;
}