From: Andreas Schwab Date: Sat, 7 Aug 1999 06:01:46 +0000 (+0000) Subject: iostream.cc: Add missing calls to isfx and setup a cleanup region for the locked... X-Git-Tag: releases/gcc-2.95.1~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=968467ebeddc9a650b6580dd36758e5893d1c74e;p=thirdparty%2Fgcc.git 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: r28572 --- diff --git a/libio/ChangeLog b/libio/ChangeLog index b5f216c59c9c..9379e09b69e1 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. + Wed Jul 28 21:39:31 PDT 1999 Jeff Law (law@cygnus.com) * gcc-2.95 Released. diff --git a/libio/iostream.cc b/libio/iostream.cc index 4b1d9d80a9b6..4b75fca764dd 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 f3de3639906a..19fbf8a4d95c 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 02b34927eb8f..5e48a000c09a 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 55617e649a0f..4b7bc9f8d3e0 100644 --- a/libio/isgetsb.cc +++ b/libio/isgetsb.cc @@ -1,59 +1,4 @@ -/* This is part of libio/iostream, providing -*- C++ -*- input/output. -Copyright (C) 1993 Free Software Foundation - -This file is part of the GNU IO Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -#include "libioP.h" -#include "iostream.h" -#include - -istream& istream::get(streambuf& sb, char delim /* = '\n' */) -{ - _gcount = 0; - if (ipfx1()) - { - register streambuf* isb = rdbuf(); - for (;;) - { - streamsize len = isb->_IO_read_end - isb->_IO_read_ptr; - if (len <= 0) - if (__underflow(isb) == EOF) - break; - else - len = isb->_IO_read_end - isb->_IO_read_ptr; - char *delimp = (char*)memchr((void*)isb->_IO_read_ptr, delim, len); - if (delimp != NULL) - len = delimp - isb->_IO_read_ptr; - int written = sb.sputn(isb->_IO_read_ptr, len); - isb->_IO_read_ptr += written; - _gcount += written; - if (written != len) - { - set(ios::failbit); - break; - } - if (delimp != NULL) - break; - } - } - return *this; -} + _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, + _strbuf); + isfx(); + _IO_cleanup_region_end (0); diff --git a/libio/isscan.cc b/libio/isscan.cc index 64d4bc682f82..88db94e3157e 100644 --- a/libio/isscan.cc +++ b/libio/isscan.cc @@ -1,45 +1,10 @@ -/* -Copyright (C) 1993 Free Software Foundation - -This file is part of the GNU IO Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -#include "libioP.h" -#include -#include - -istream& istream::scan(const char *format ...) -{ - if (ipfx0()) { - va_list ap; - va_start(ap, format); - _strbuf->vscan(format, ap, this); - va_end(ap); - } - return *this; -} - -istream& istream::vscan(const char *format, _IO_va_list args) -{ - if (ipfx0()) - _strbuf->vscan(format, args, this); - return *this; -} + _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, + _strbuf); + isfx(); + _IO_cleanup_region_end (0); + { + _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, + _strbuf); + isfx(); + _IO_cleanup_region_end (0); + }