From ff76d1ee8676697b5ddccca40330b96efde1c07e Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 7 Aug 1999 06:02:05 +0000 Subject: [PATCH] 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 --- libio/ChangeLog | 9 ++++++++ libio/iostream.cc | 65 ++++++++++++++++++++++++++++++++++++++++++++++++------ libio/iostream.h | 1 + libio/isgetline.cc | 12 ++++++++++ libio/isgetsb.cc | 4 ++++ libio/isscan.cc | 10 +++++++++ 6 files changed, 94 insertions(+), 7 deletions(-) diff --git a/libio/ChangeLog b/libio/ChangeLog index a2cac6b..36150ed 100644 --- a/libio/ChangeLog +++ b/libio/ChangeLog @@ -1,3 +1,12 @@ +1999-08-07 Andreas Schwab + + * 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 * configure.in (post-target): Use "$(topsrcdir)", not "$(srcdir)/..". diff --git a/libio/iostream.cc b/libio/iostream.cc index 4b1d9d8..4b75fca 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 f3de363..19fbf8a 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 02b3492..5e48a00 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 55617e6..655c972 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 64d4bc6..977559c 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; } -- 2.7.4