OSDN Git Service

2001-04-03 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Apr 2001 01:02:26 +0000 (01:02 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Apr 2001 01:02:26 +0000 (01:02 +0000)
* include/bits/fstream.tcc: Add bool parameter to filebuf ctor.
* include/bits/ios_base.h(ios_base::Init): Remove _M_cout, _M_cin,
_M_cerr, _M_wcout, _M_wcin, _M_wcerr.
(ios_base::Init::_S_ios_create): New.
(ios_base::Init::_S_ios_destroy): New.
* include/bits/std_fstream.h: Change ctor args.
* src/ios.cc (ios_base::Init::Init): Use _S_ios_create.
(ios_base::Init::~Init): Use _S_ios_destroy.
(ios_base::sync_with_stdio): Use new members.
* testsuite/27_io/filebuf_members.cc: Fix calling conventions for
filebuf ctor.

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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/fstream.tcc
libstdc++-v3/include/bits/ios_base.h
libstdc++-v3/include/bits/std_fstream.h
libstdc++-v3/src/ios.cc
libstdc++-v3/testsuite/27_io/filebuf_members.cc

index ebba1ec..09906da 100644 (file)
@@ -1,3 +1,17 @@
+2001-04-03  Benjamin Kosnik  <bkoz@redhat.com>
+
+       * include/bits/fstream.tcc: Add bool parameter to filebuf ctor.
+       * include/bits/ios_base.h(ios_base::Init): Remove _M_cout, _M_cin,
+       _M_cerr, _M_wcout, _M_wcin, _M_wcerr.
+       (ios_base::Init::_S_ios_create): New.
+       (ios_base::Init::_S_ios_destroy): New.  
+       * include/bits/std_fstream.h: Change ctor args.
+       * src/ios.cc (ios_base::Init::Init): Use _S_ios_create.
+       (ios_base::Init::~Init): Use _S_ios_destroy.
+       (ios_base::sync_with_stdio): Use new members.
+       * testsuite/27_io/filebuf_members.cc: Fix calling conventions for
+       filebuf ctor.
+
 2001-04-03  Peter Schmid  <schmid@snake.iap.physik.tu-darmstadt.de>
 
         * include/backward/fstream.h:  Expose streampos to global
index 93fe7a1..c1311e9 100644 (file)
@@ -90,15 +90,22 @@ namespace std
 
   template<typename _CharT, typename _Traits>
     basic_filebuf<_CharT, _Traits>::
-    basic_filebuf(__c_file_type* __f, ios_base::openmode __mode)
+    basic_filebuf(__c_file_type* __f, bool __s, ios_base::openmode __mode)
     : __streambuf_type(),  _M_file(NULL), _M_state_cur(__state_type()), 
     _M_state_beg(__state_type()), _M_last_overflowed(false)
     {
       _M_filebuf_init();
       _M_file->sys_open(__f, __mode);
       if (this->is_open())
-       _M_mode = __mode;
-   }
+       {
+         _M_mode = __mode;
+         if (!__s)
+           {
+             _M_allocate_buffers();
+             _M_set_indeterminate();
+           }
+       }
+    }
 
   template<typename _CharT, typename _Traits>
     basic_filebuf<_CharT, _Traits>::__filebuf_type* 
index ce68bf1..31b8d3a 100644 (file)
@@ -295,17 +295,16 @@ namespace std
     public:
       Init();
       ~Init();
+      
+      static void
+      _S_ios_create(bool __sync);
+      
+      static void
+      _S_ios_destroy();
+
     private:
       static int       _S_ios_base_init;
       static bool      _S_synced_with_stdio;
-      filebuf*                 _M_cout;
-      filebuf*                 _M_cin;
-      filebuf*                 _M_cerr;
-#ifdef _GLIBCPP_USE_WCHAR_T
-      wfilebuf*        _M_wcout;
-      wfilebuf*                _M_wcin;
-      wfilebuf*        _M_wcerr;
-#endif
     };
 
     // Fmtflags state:
index d715c23..63a86b9 100644 (file)
@@ -86,7 +86,7 @@ namespace std
       basic_filebuf();
 
       // Non-standard ctor:
-      basic_filebuf(__c_file_type* __f, ios_base::openmode __mode);
+      basic_filebuf(__c_file_type* __f, bool __s, ios_base::openmode __mode);
  
       virtual 
       ~basic_filebuf() 
index 8926401..de577d6 100644 (file)
@@ -133,63 +133,61 @@ namespace std
   ios_base::failure::what() const throw()
   { return _M_name; }
 
+  void
+  ios_base::Init::_S_ios_create(bool __sync)
+  {
+    // NB: The file std_iostream.h creates the four standard files
+    // with NULL buffers. At this point, we swap out these
+    new (&cout) ostream(new filebuf(stdout, __sync, ios_base::out));
+    new (&cin) istream(new filebuf(stdin, __sync, ios_base::in));
+    new (&cerr) ostream(new filebuf(stderr, __sync, ios_base::out));
+    new (&clog) ostream(cerr.rdbuf());
+    cin.tie(&cout);
+    cerr.flags(ios_base::unitbuf);
+    
+#ifdef _GLIBCPP_USE_WCHAR_T
+    new (&wcout) wostream( new wfilebuf(stdout, __sync, ios_base::out));
+    new (&wcin) wistream(new wfilebuf(stdin, __sync, ios_base::in));
+    new (&wcerr) wostream(new wfilebuf(stderr, __sync, ios_base::out));
+    new (&wclog) wostream(wcerr.rdbuf());
+    wcin.tie(&wcout);
+    wcerr.flags(ios_base::unitbuf);
+#endif
+  }
+
   ios_base::Init::Init()
   {
     if (++_S_ios_base_init == 1)
       {
-       // NB: std_iostream.h creates the four standard files with
-       // NULL buffers. At this point, we swap out these placeholder
-       // objects for the properly-constructed ones
-               _M_cout = new filebuf(stdout, ios_base::out);
-       _M_cin = new filebuf(stdin, ios_base::in);
-       _M_cerr = new filebuf(stderr, ios_base::out);
-       new (&cout) ostream(_M_cout);
-       new (&cin) istream(_M_cin);
-       new (&cerr) ostream(_M_cerr);
-       new (&clog) ostream(_M_cerr);
-       cin.tie(&cout);
-       cerr.flags(ios_base::unitbuf);
+       // Standard streams default to synced with "C" operations.
+       ios_base::Init::_S_synced_with_stdio = true;
+       _S_ios_create(ios_base::Init::_S_synced_with_stdio);
+      }
+  }
 
+  void
+  ios_base::Init::_S_ios_destroy()
+  {
+    cout.flush();
+    cerr.flush();
+    clog.flush();
+    delete cout.rdbuf();
+    delete cin.rdbuf();
+    delete cerr.rdbuf();
 #ifdef _GLIBCPP_USE_WCHAR_T
-       _M_wcout = new wfilebuf(stdout, ios_base::out);
-       _M_wcin = new wfilebuf(stdin, ios_base::in);
-       _M_wcerr = new wfilebuf(stderr, ios_base::out);
-       new (&wcout) wostream(_M_wcout);
-       new (&wcin) wistream(_M_wcin);
-       new (&wcerr) wostream(_M_wcerr);
-       new (&wclog) wostream(_M_wcerr);
-       wcin.tie(&wcout);
-       wcerr.flags(ios_base::unitbuf);
+    wcout.flush();
+    wcerr.flush();
+    wclog.flush();
+    delete wcout.rdbuf();
+    delete wcin.rdbuf();
+    delete wcerr.rdbuf();
 #endif
-       ios_base::Init::_S_synced_with_stdio = true;
-      }
   }
 
   ios_base::Init::~Init()
   {
     if (--_S_ios_base_init == 0)
-      {
-       cout.flush();
-       cerr.flush();
-       clog.flush();
-       delete _M_cout;
-       delete _M_cin;
-       delete _M_cerr;
-       _M_cout = NULL;
-       _M_cin = NULL;
-       _M_cerr = NULL;
-#ifdef _GLIBCPP_USE_WCHAR_T
-       wcout.flush();
-       wcerr.flush();
-       wclog.flush();
-       delete _M_wcout;
-       delete _M_wcin;
-       delete _M_wcerr;
-       _M_wcout = NULL;
-       _M_wcin = NULL;
-       _M_wcerr = NULL;
-#endif
-      }
+      _S_ios_destroy();
   } 
 
   // 27.4.2.5  ios_base storage functions
@@ -323,31 +321,11 @@ namespace std
     // currently synchronized.
     if (!__sync && __ret)
       {
-#if 0
-       // no longer need to do this
-       // Need to dispose of the buffers created at initialization.
-       __ioinit._M_cout->~filebuf();
-       __ioinit._M_cin->~filebuf();
-       __ioinit._M_cerr->~filebuf();
-       __ioinit._M_cout = new filebuf();
-       __ioinit._M_cin = new filebuf();
-       __ioinit._M_cerr = new filebuf();
-       __ioinit._M_cout->open("stdout", ios_base::out);
-       __ioinit._M_cin->open("stdin", ios_base::in);
-       __ioinit._M_cerr->open("stderr", ios_base::out);
-       cout.rdbuf(__ioinit._M_cout);
-       cin.rdbuf(__ioinit._M_cin);
-       cerr.rdbuf(__ioinit._M_cerr);
-       cerr.flags(ios_base::unitbuf);
-       clog.rdbuf(__ioinit._M_cerr);
-#endif
-#ifdef _GLIBCPP_USE_WCHAR_T
-#endif
        ios_base::Init::_S_synced_with_stdio = false;
+       ios_base::Init::_S_ios_destroy();
+       ios_base::Init::_S_ios_create(ios_base::Init::_S_synced_with_stdio);
       }
-    
     return __ret; 
   }
-
 }  // namespace std
 
index ecb5ae0..3eda6f5 100644 (file)
@@ -52,7 +52,7 @@ test_01()
   FILE* f2 = fopen(name_01, "r");
   VERIFY( f2 != NULL );
   {
-    std::filebuf fb(f2, std::ios_base::in);
+    std::filebuf fb(f2, false, std::ios_base::in);
   }
   close_num = fclose(f2);
   VERIFY( close_num == 0 );