OSDN Git Service

* iostream.cc: Add missing calls to isfx and setup a cleanup
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 7 Aug 1999 06:02:05 +0000 (06:02 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 7 Aug 1999 06:02:05 +0000 (06:02 +0000)
region for the locked stream.
* iostream.h: Likewise.
* isgetline.cc: Likewise.
* isgetsb.cc: Likewise.
* isscan.cc: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@28573 138bc75d-0d04-0410-961f-82ee72b054a4

libio/ChangeLog
libio/iostream.cc
libio/iostream.h
libio/isgetline.cc
libio/isgetsb.cc
libio/isscan.cc

index a2cac6b..36150ed 100644 (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)/..".
index 4b1d9d8..4b75fca 100644 (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;
index f3de363..19fbf8a 100644 (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();
index 02b3492..5e48a00 100644 (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;
index 55617e6..655c972 100644 (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;
 }
index 64d4bc6..977559c 100644 (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;
 }