summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libio/ChangeLog9
-rw-r--r--libio/iostream.cc65
-rw-r--r--libio/iostream.h1
-rw-r--r--libio/isgetline.cc12
-rw-r--r--libio/isgetsb.cc4
-rw-r--r--libio/isscan.cc10
6 files changed, 94 insertions, 7 deletions
diff --git a/libio/ChangeLog b/libio/ChangeLog
index a2cac6b89d9..36150ed49ea 100644
--- a/libio/ChangeLog
+++ b/libio/ChangeLog
@@ -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)/..".
diff --git a/libio/iostream.cc b/libio/iostream.cc
index 4b1d9d80a9b..4b75fca764d 100644
--- a/libio/iostream.cc
+++ b/libio/iostream.cc
@@ -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;
diff --git a/libio/iostream.h b/libio/iostream.h
index f3de3639906..19fbf8a4d95 100644
--- a/libio/iostream.h
+++ b/libio/iostream.h
@@ -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();
diff --git a/libio/isgetline.cc b/libio/isgetline.cc
index 02b34927eb8..5e48a000c09 100644
--- a/libio/isgetline.cc
+++ b/libio/isgetline.cc
@@ -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;
diff --git a/libio/isgetsb.cc b/libio/isgetsb.cc
index 55617e649a0..655c972589a 100644
--- a/libio/isgetsb.cc
+++ b/libio/isgetsb.cc
@@ -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;
}
diff --git a/libio/isscan.cc b/libio/isscan.cc
index 64d4bc682f8..977559c2cba 100644
--- a/libio/isscan.cc
+++ b/libio/isscan.cc
@@ -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;
}