This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[v3] libstdc++/1886, preliminary wchar_t config work



Needed so that wchar_t bits can be instantiated with the stdio IO
model for libstdc++-v3. Also fixes a bug.

tested x86/linux
(install/build/libio/stdio)

Installed on branch and head.

2001-02-27  Benjamin Kosnik  <bkoz@redhat.com>

	libstdc++/1886
	* include/bits/basic_file.h: Include basic_file_model.h.
	* config/c_io_libio.cc: Move to...
	* config/basic_file_libio.cc: Here.
	* config/basic_file_libio.h: New file.
	* config/c_io_stdio.cc: Move to...
	* config/basic_file_stdio.cc: Here.
	* config/basic_file_stdio.h: New file.
	* config/c_io_libio.h: Tweak.
	* config/c_io_stdio.h: Tweak.
	* src/Makefile.am (build_headers): Add basic_file_model.h.
	(sources): Add basic_file.cc, remove c++io.cc.
	* src/Makefile.in: Regenerate.
	* acinclude.m4 (GLIBCPP_ENABLE_CSTDIO): Add support for
	basic_file_model.h and basic_file.cc.
	* aclocal.m4: Regenerate.
	* configure: Regenerate.
	* testsuite/27_io/filebuf.cc (test05): Add regression.

Index: include/bits/basic_file.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/basic_file.h,v
retrieving revision 1.4
diff -c -p -r1.4 basic_file.h
*** basic_file.h	2001/02/19 18:52:24	1.4
--- basic_file.h	2001/02/28 03:15:32
***************
*** 1,6 ****
  // Wrapper of C-language FILE struct -*- C++ -*-
  
! // Copyright (C) 1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Wrapper of C-language FILE struct -*- C++ -*-
  
! // Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 39,46 ****
  #include <bits/c++config.h>
  #include <bits/std_ios.h>
  
! namespace std {
! 
    // Ulrich is going to make some detailed comment here, explaining
    // all this unpleasantness, providing detailed performance analysis
    // as to why we have to do all this lame vtable hacking instead of a
--- 39,46 ----
  #include <bits/c++config.h>
  #include <bits/std_ios.h>
  
! namespace std 
! {
    // Ulrich is going to make some detailed comment here, explaining
    // all this unpleasantness, providing detailed performance analysis
    // as to why we have to do all this lame vtable hacking instead of a
*************** namespace std {
*** 48,114 ****
    // and detailed description of the whole object-layout,
    // vtable-swapping, sordid history of this hack.
    template<typename _CharT>
!   struct __basic_file_base: public __c_file_type
!   {
!     virtual 
!     ~__basic_file_base() { };
  
!     virtual int 
!     overflow(int __c = EOF) = 0;
  
!     virtual int 
!     underflow() = 0;
  
!     virtual int 
!     uflow() = 0;
  
!     virtual int 
!     pbackfail(int __c) = 0;
  
!     virtual streamsize 
!     xsputn(const _CharT* __s, streamsize __n) = 0;
  
!     virtual streamsize 
!     xsgetn(_CharT* __s, streamsize __n) = 0;
  
!     virtual streamoff
!     seekoff(streamoff __off, ios_base::seekdir __way,
! 	    ios_base::openmode __mode = ios_base::in | ios_base::out) = 0;
  
!     virtual streamoff
!     seekpos(streamoff __pos, 
! 	    ios_base::openmode __mode = ios_base::in | ios_base::out) = 0;
  
!     virtual streambuf* 
!     setbuf(_CharT* __b, int __len) = 0;
  
!     virtual int 
!     sync() = 0;
  
!     virtual int 
!     doallocate() = 0;
  
!     virtual streamsize 
!     sys_read(_CharT* __s, streamsize __n) = 0;
  
!     virtual streamsize 
!     sys_write(const _CharT* __s, streamsize __n) = 0;
  
!     virtual streamoff
!     sys_seek(streamoff __off, ios_base::seekdir __way) = 0;
  
!     virtual int 
!     sys_close() = 0;
  
!     virtual int 
!     sys_stat(void* __v) = 0;
  
!     virtual int 
!     showmanyc() = 0;
  
!     virtual void 
!     imbue(void* __v) = 0;
!   };
  
    // Some of these member functions are based on libio/filebuf.cc.
    // Also note that the order and number of virtual functions has to precisely
--- 48,114 ----
    // and detailed description of the whole object-layout,
    // vtable-swapping, sordid history of this hack.
    template<typename _CharT>
!     struct __basic_file_base: public __c_file_type
!     {
!       virtual 
!       ~__basic_file_base() { };
  
!       virtual int 
!       overflow(int __c = EOF) = 0;
  
!       virtual int 
!       underflow() = 0;
  
!       virtual int 
!       uflow() = 0;
  
!       virtual int 
!       pbackfail(int __c) = 0;
  
!       virtual streamsize 
!       xsputn(const _CharT* __s, streamsize __n) = 0;
  
!       virtual streamsize 
!       xsgetn(_CharT* __s, streamsize __n) = 0;
  
!       virtual streamoff
!       seekoff(streamoff __off, ios_base::seekdir __way,
! 	      ios_base::openmode __mode = ios_base::in | ios_base::out) = 0;
  
!       virtual streamoff
!       seekpos(streamoff __pos, 
! 	      ios_base::openmode __mode = ios_base::in | ios_base::out) = 0;
  
!       virtual streambuf* 
!       setbuf(_CharT* __b, int __len) = 0;
  
!       virtual int 
!       sync() = 0;
  
!       virtual int 
!       doallocate() = 0;
  
!       virtual streamsize 
!       sys_read(_CharT* __s, streamsize __n) = 0;
  
!       virtual streamsize 
!       sys_write(const _CharT* __s, streamsize __n) = 0;
  
!       virtual streamoff
!       sys_seek(streamoff __off, ios_base::seekdir __way) = 0;
  
!       virtual int 
!       sys_close() = 0;
  
!       virtual int 
!       sys_stat(void* __v) = 0;
  
!       virtual int 
!       showmanyc() = 0;
  
!       virtual void 
!       imbue(void* __v) = 0;
!     };
  
    // Some of these member functions are based on libio/filebuf.cc.
    // Also note that the order and number of virtual functions has to precisely
*************** namespace std {
*** 240,252 ****
        imbue(void* __v);
      };
  } // namespace std
- 
- #endif	/* _CPP_BASIC_FILE */
- 
- 
- 
- 
- 
  
  
  
--- 240,249 ----
        imbue(void* __v);
      };
  } // namespace std
  
+ // Now include the bits that are dependant on the underlying I/O
+ // model chosen at configure time.
+ #include <bits/basic_file_model.h>
  
+ #endif	// _CPP_BASIC_FILE
  
Index: config/c_io_libio.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/c_io_libio.h,v
retrieving revision 1.7
diff -c -p -r1.7 c_io_libio.h
*** c_io_libio.h	2000/11/01 21:38:32	1.7
--- c_io_libio.h	2001/02/28 03:15:32
***************
*** 1,6 ****
  // underlying io library  -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // underlying io library  -*- C++ -*-
  
! // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 34,41 ****
  
  #include <libio.h>
  
! namespace std {
! 
  // from fpos.h
    typedef _IO_ssize_t 	streamsize; // Signed integral type
    typedef _IO_ssize_t 	wstreamsize;
--- 34,41 ----
  
  #include <libio.h>
  
! namespace std 
! {
  // from fpos.h
    typedef _IO_ssize_t 	streamsize; // Signed integral type
    typedef _IO_ssize_t 	wstreamsize;
*************** namespace std {
*** 103,109 ****
      static const __int_type _S_out =		_IOS_OUTPUT;
      static const __int_type _S_trunc =		_IOS_TRUNC;
    };
- 
  }
  
  #endif // _CPP_IO_LIBIO_H
--- 103,108 ----
Index: config/c_io_stdio.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/c_io_stdio.h,v
retrieving revision 1.6
diff -c -p -r1.6 c_io_stdio.h
*** c_io_stdio.h	2000/11/17 01:04:01	1.6
--- c_io_stdio.h	2001/02/28 03:15:32
***************
*** 1,6 ****
  // underlying io library  -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // underlying io library  -*- C++ -*-
  
! // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 36,43 ****
  #include <stddef.h>
  #include <bits/c++threads.h>
  
! namespace std {
! 
  // from fpos.h
    typedef long  	streamoff;
    typedef ptrdiff_t	streamsize; // Signed integral type
--- 36,43 ----
  #include <stddef.h>
  #include <bits/c++threads.h>
  
! namespace std 
! {
  // from fpos.h
    typedef long  	streamoff;
    typedef ptrdiff_t	streamsize; // Signed integral type
*************** namespace std {
*** 59,100 ****
  
  // from ios_base.h
    struct __ios_flags
!  {
!    typedef short __int_type;
  
!    static const __int_type _S_boolalpha =	0x0001;
!    static const __int_type _S_dec =		0x0002;
!    static const __int_type _S_fixed = 		0x0004;
!    static const __int_type _S_hex =		0x0008;
!    static const __int_type _S_internal = 	0x0010;
!    static const __int_type _S_left =   		0x0020;
!    static const __int_type _S_oct =		0x0040;
!    static const __int_type _S_right =		0x0080;
!    static const __int_type _S_scientific =	0x0100;
!    static const __int_type _S_showbase =       	0x0200;
!    static const __int_type _S_showpoint =	0x0400;
!    static const __int_type _S_showpos =		0x0800;
!    static const __int_type _S_skipws =		0x1000;
!    static const __int_type _S_unitbuf =		0x2000;
!    static const __int_type _S_uppercase	=	0x4000;
!    static const __int_type _S_adjustfield =	0x0020 | 0x0080 | 0x0010;
!    static const __int_type _S_basefield =	0x0002 | 0x0040 | 0x0008;
!    static const __int_type _S_floatfield =	0x0100 | 0x0004;
  
      // 27.4.2.1.3  Type ios_base::iostate
!    static const __int_type _S_badbit =		0x01;
!    static const __int_type _S_eofbit =		0x02;
!    static const __int_type _S_failbit =		0x04;
  
      // 27.4.2.1.4  Type openmode
!    static const __int_type _S_app =		0x01;
!    static const __int_type _S_ate =		0x02;
!    static const __int_type _S_bin =		0x04;
!    static const __int_type _S_in =		0x08;
!    static const __int_type _S_out =		0x10;
!    static const __int_type _S_trunc =		0x20;
    };
- 
  }
  
  #endif // _CPP_IO_STDIO_H
--- 59,99 ----
  
  // from ios_base.h
    struct __ios_flags
!   {
!     typedef short __int_type;
  
!     static const __int_type _S_boolalpha =	0x0001;
!     static const __int_type _S_dec =		0x0002;
!     static const __int_type _S_fixed = 		0x0004;
!     static const __int_type _S_hex =		0x0008;
!     static const __int_type _S_internal = 	0x0010;
!     static const __int_type _S_left =   	0x0020;
!     static const __int_type _S_oct =		0x0040;
!     static const __int_type _S_right =		0x0080;
!     static const __int_type _S_scientific =	0x0100;
!     static const __int_type _S_showbase =       0x0200;
!     static const __int_type _S_showpoint =	0x0400;
!     static const __int_type _S_showpos =	0x0800;
!     static const __int_type _S_skipws =		0x1000;
!     static const __int_type _S_unitbuf =	0x2000;
!     static const __int_type _S_uppercase =	0x4000;
!     static const __int_type _S_adjustfield =	0x0020 | 0x0080 | 0x0010;
!     static const __int_type _S_basefield =	0x0002 | 0x0040 | 0x0008;
!     static const __int_type _S_floatfield =	0x0100 | 0x0004;
  
      // 27.4.2.1.3  Type ios_base::iostate
!     static const __int_type _S_badbit =		0x01;
!     static const __int_type _S_eofbit =		0x02;
!     static const __int_type _S_failbit =       	0x04;
  
      // 27.4.2.1.4  Type openmode
!     static const __int_type _S_app =		0x01;
!     static const __int_type _S_ate =		0x02;
!     static const __int_type _S_bin =		0x04;
!     static const __int_type _S_in =		0x08;
!     static const __int_type _S_out =		0x10;
!     static const __int_type _S_trunc =		0x20;
    };
  }
  
  #endif // _CPP_IO_STDIO_H
Index: src/Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/Makefile.am,v
retrieving revision 1.74
diff -c -p -r1.74 Makefile.am
*** Makefile.am	2001/02/26 21:48:01	1.74
--- Makefile.am	2001/02/28 03:15:33
*************** endif
*** 160,165 ****
--- 160,166 ----
  build_headers = \
  	bits/std_limits.h \
  	bits/c++config.h bits/c++io.h bits/c++locale.h bits/c++threads.h \
+ 	bits/basic_file_model.h \
  	bits/atomicity.h bits/os_defines.h \
  	bits/ctype_base.h bits/ctype_noninline.h bits/ctype_inline.h 
  
*************** sources = \
*** 167,173 ****
  	limitsMEMBERS.cc \
  	stdexcept.cc functexcept.cc bitset.cc \
          globals.cc \
! 	c++io.cc ios.cc complex_io.cc strstream.cc \
  	c++locale.cc locale.cc localename.cc codecvt.cc \
  	locale-inst.cc stl-inst.cc misc-inst.cc valarray-inst.cc string-inst.cc
  
--- 168,174 ----
  	limitsMEMBERS.cc \
  	stdexcept.cc functexcept.cc bitset.cc \
          globals.cc \
! 	basic_file.cc ios.cc complex_io.cc strstream.cc \
  	c++locale.cc locale.cc localename.cc codecvt.cc \
  	locale-inst.cc stl-inst.cc misc-inst.cc valarray-inst.cc string-inst.cc
  
Index: acinclude.m4
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/acinclude.m4,v
retrieving revision 1.132
diff -c -p -r1.132 acinclude.m4
*** acinclude.m4	2001/02/26 21:47:54	1.132
--- acinclude.m4	2001/02/28 03:15:38
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1110,1116 ****
    case x${enable_cstdio_flag} in
      xlibio)
        CSTDIO_H=config/c_io_libio.h
!       CSTDIO_CC=config/c_io_libio.cc
        AC_MSG_RESULT(libio)
  
        # see if we are on a system with libio native (ie, linux)
--- 1110,1117 ----
    case x${enable_cstdio_flag} in
      xlibio)
        CSTDIO_H=config/c_io_libio.h
!       BASIC_FILE_H=config/basic_file_libio.h
!       BASIC_FILE_CC=config/basic_file_libio.cc
        AC_MSG_RESULT(libio)
  
        # see if we are on a system with libio native (ie, linux)
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1166,1172 ****
      xstdio | x | xno | xnone | xyes)
        # default
        CSTDIO_H=config/c_io_stdio.h
!       CSTDIO_CC=config/c_io_stdio.cc
        AC_MSG_RESULT(stdio)
  
        # We're not using stdio.
--- 1167,1174 ----
      xstdio | x | xno | xnone | xyes)
        # default
        CSTDIO_H=config/c_io_stdio.h
!       BASIC_FILE_H=config/basic_file_stdio.h
!       BASIC_FILE_CC=config/basic_file_stdio.cc
        AC_MSG_RESULT(stdio)
  
        # We're not using stdio.
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1181,1187 ****
        ;;
    esac
    AC_LINK_FILES($CSTDIO_H, include/bits/c++io.h)
!   AC_LINK_FILES($CSTDIO_CC, src/c++io.cc)
  
    # 2000-08-04 bkoz hack
    CCODECVT_C=config/c_io_libio_codecvt.c
--- 1183,1190 ----
        ;;
    esac
    AC_LINK_FILES($CSTDIO_H, include/bits/c++io.h)
!   AC_LINK_FILES($BASIC_FILE_H, include/bits/basic_file_model.h)
!   AC_LINK_FILES($BASIC_FILE_CC, src/basic_file.cc)
  
    # 2000-08-04 bkoz hack
    CCODECVT_C=config/c_io_libio_codecvt.c
Index: testsuite/27_io/filebuf.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/filebuf.cc,v
retrieving revision 1.8
diff -c -p -r1.8 filebuf.cc
*** filebuf.cc	2001/01/25 04:09:21	1.8
--- filebuf.cc	2001/02/28 03:15:39
*************** bool test04()
*** 524,529 ****
--- 524,535 ----
    return test;
  }
  
+ // test05
+ // libstdc++/1886
+ // should be able to instantiate basic_filebuf for non-standard types.
+ template class std::basic_filebuf<short, std::char_traits<short> >;
+ 
+ 
  int main() 
  {
    test00();
Index: config/basic_file_libio.h
===================================================================
RCS file: basic_file_libio.h
diff -N basic_file_libio.h
*** /dev/null	Tue May  5 13:32:27 1998
--- basic_file_libio.h	Tue Feb 27 19:16:31 2001
***************
*** 0 ****
--- 1,296 ----
+ // Wrapper of C-language FILE struct -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ 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, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself 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.
+ 
+ //
+ // ISO C++ 14882: 27.8  File-based streams
+ //
+ 
+ #include <libioP.h>
+ 
+ namespace std 
+ {
+   // __basic_file<char> specializations
+   template<>
+     __basic_file<char>::__basic_file(__c_lock* __lock);
+ 
+   template<>
+     int 
+     __basic_file<char>::overflow(int __c);
+ 
+   template<>
+     int 
+     __basic_file<char>::underflow();
+ 
+   template<>
+     int 
+     __basic_file<char>::uflow();
+ 
+   template<>
+     int 
+     __basic_file<char>::pbackfail(int __c);
+ 
+   template<>
+     streamsize 
+     __basic_file<char>::xsputn(const char* __s, streamsize __n);
+ 
+   template<>
+     streamoff
+     __basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 				ios_base::openmode __mode);
+ 
+   template<>
+     streamoff
+     __basic_file<char>::seekpos(streamoff __pos, ios_base::openmode __mode);
+ 
+   template<>
+     streambuf* 
+     __basic_file<char>::setbuf(char* __b, int __len);
+ 
+   template<>
+     int 
+     __basic_file<char>::sync();
+ 
+   template<>
+     int 
+     __basic_file<char>::doallocate();
+ 
+   // __basic_file<wchar_t> specializations
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<>
+     __basic_file<wchar_t>::__basic_file(__c_lock* __lock);
+ 
+   template<>
+     int 
+     __basic_file<wchar_t>::overflow(int __c);
+ 
+   template<>
+     int 
+     __basic_file<wchar_t>::underflow();
+ 
+   template<>
+     int 
+     __basic_file<wchar_t>::uflow();
+ 
+   template<>
+     int 
+     __basic_file<wchar_t>::pbackfail(int __c);
+ 
+   template<>
+     streamsize 
+     __basic_file<wchar_t>::xsputn(const wchar_t* __s, streamsize __n);
+ 
+   template<>
+     streamoff
+     __basic_file<wchar_t>::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 				ios_base::openmode __mode);
+ 
+   template<>
+     streamoff
+     __basic_file<wchar_t>::seekpos(streamoff __pos, ios_base::openmode __mode);
+ 
+   template<>
+     streambuf* 
+     __basic_file<wchar_t>::setbuf(wchar_t* __b, int __len);
+ 
+   template<>
+     int 
+     __basic_file<wchar_t>::sync();
+ 
+   template<>
+     int 
+     __basic_file<wchar_t>::doallocate();
+ #endif
+ 
+   // Generic definitions for __basic_file
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::get_fileno(void)
+     { return _fileno; }
+  
+   template<typename _CharT>
+     __basic_file<_CharT>::~__basic_file()
+     { _IO_file_finish(this, 0); }
+       
+   template<typename _CharT>
+     void 
+     __basic_file<_CharT>::_M_open_mode(ios_base::openmode __mode, 
+ 				       int& __p_mode, int& __rw_mode, 
+ 				       char* /*__c_mode*/)
+     {  
+ #ifdef O_BINARY
+       bool __testb = __mode & ios_base::binary;
+ #endif
+       bool __testi = __mode & ios_base::in;
+       bool __testo = __mode & ios_base::out;
+       bool __testt = __mode & ios_base::trunc;
+       bool __testa = __mode & ios_base::app;
+       
+       if (!__testi && __testo && !__testt && !__testa)
+ 	{
+ 	  __p_mode = O_WRONLY | O_TRUNC | O_CREAT;
+ 	  __rw_mode = _IO_NO_READS;
+ 	}
+       if (!__testi && __testo && !__testt && __testa)
+ 	{
+ 	  __p_mode = O_WRONLY | O_APPEND | O_CREAT;
+ 	  __rw_mode = _IO_NO_READS | _IO_IS_APPENDING;
+ 	}
+       if (!__testi && __testo && __testt && !__testa)
+ 	{
+ 	  __p_mode = O_WRONLY | O_TRUNC | O_CREAT;
+ 	  __rw_mode = _IO_NO_READS;
+ 	}
+       if (__testi && !__testo && !__testt && !__testa)
+ 	{
+ 	  __p_mode = O_RDONLY;
+ 	  __rw_mode = _IO_NO_WRITES;
+ 	}
+       if (__testi && __testo && !__testt && !__testa)
+ 	{
+ 	  __p_mode = O_RDWR;
+ 	  __rw_mode = 0;
+ 	}
+       if (__testi && __testo && __testt && !__testa)
+ 	{
+ 	  __p_mode = O_RDWR | O_TRUNC | O_CREAT;
+ 	  __rw_mode = 0;
+ 	}
+ #ifdef O_BINARY
+       if (__testb)
+ 	__p_mode |= O_BINARY;
+ #endif	   
+     }
+   
+   template<typename _CharT>
+     __basic_file<_CharT>*
+     __basic_file<_CharT>::sys_open(int __fd, ios_base::openmode __mode) 
+     {
+       __basic_file* __ret = NULL;
+       int __p_mode = 0;
+       int __rw_mode = _IO_NO_READS + _IO_NO_WRITES; 
+       char __c_mode[4];
+       
+       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
+ 
+       if (!_IO_file_is_open(this))
+ 	{
+ 	  _fileno = __fd;
+ 	  _flags &= ~(_IO_NO_READS+_IO_NO_WRITES);
+ 	  _flags |= _IO_DELETE_DONT_CLOSE;
+ 	  _offset = _IO_pos_BAD;
+ 	  int __mask = _IO_NO_READS + _IO_NO_WRITES + _IO_IS_APPENDING;
+ 	  _IO_mask_flags(this, __rw_mode, __mask);
+ 	}
+ 
+       return __ret;
+     }
+   
+   template<typename _CharT>
+     __basic_file<_CharT>* 
+     __basic_file<_CharT>::open(const char* __name, ios_base::openmode __mode, 
+ 			       int __prot)
+     {
+       __basic_file* __ret = NULL;
+       int __p_mode = 0;
+       int __rw_mode = _IO_NO_READS + _IO_NO_WRITES; 
+       char __c_mode[4];
+ 
+       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
+       if (!_IO_file_is_open(this))
+ 	{
+ 	  __c_file_type* __f;
+ 	  __f = _IO_file_open(this, __name, __p_mode, __prot, __rw_mode, 0);
+ 	  __ret = __f ? this: NULL;
+ 	}
+       return __ret;
+     }
+   
+   template<typename _CharT>
+     bool 
+     __basic_file<_CharT>::is_open() { return _fileno >= 0; }
+   
+   template<typename _CharT>
+     __basic_file<_CharT>* 
+     __basic_file<_CharT>::close()
+     { 
+       return _IO_file_close_it(this) ? static_cast<__basic_file*>(NULL) : this;
+     }
+  
+   template<typename _CharT>
+     streamsize 
+     __basic_file<_CharT>::xsgetn(_CharT* __s, streamsize __n)
+     { return _IO_file_xsgetn(this, __s, __n); }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     streamsize 
+     __basic_file<_CharT>::sys_read(_CharT* __s, streamsize __n) 
+     { return _IO_file_read(this, __s, __n); }
+ 
+   // NB: Unused.    
+   template<typename _CharT>
+     streamsize 
+     __basic_file<_CharT>::sys_write(const _CharT* __s, streamsize __n) 
+     { return _IO_file_write(this, __s, __n); }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     streamoff
+     __basic_file<_CharT>::sys_seek(streamoff __pos, ios_base::seekdir __way)
+     { return _IO_file_seek(this, __pos, __way); }
+   
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::sys_close() 
+     { return _IO_file_close(this); }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::sys_stat(void* __v) 
+     { return _IO_file_stat(this, __v); }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::showmanyc() { return EOF; }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     void 
+     __basic_file<_CharT>::imbue(void* /*__v*/) { }
+ }  // namespace std
Index: config/basic_file_libio.cc
===================================================================
RCS file: basic_file_libio.cc
diff -N basic_file_libio.cc
*** /dev/null	Tue May  5 13:32:27 1998
--- basic_file_libio.cc	Tue Feb 27 19:16:31 2001
***************
*** 0 ****
--- 1,194 ----
+ // Wrapper of C-language FILE struct -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ 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, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself 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.
+ 
+ //
+ // ISO C++ 14882: 27.8  File-based streams
+ //
+ 
+ #include <bits/basic_file.h>
+ 
+ namespace std 
+ {
+   // __basic_file<char> definitions
+   __basic_file<char>::__basic_file(__c_lock* __lock)
+   {
+ #ifdef _IO_MTSAFE_IO
+     _lock = __lock;
+ #endif
+     // Don't set the orientation of the stream when initializing.
+ #ifdef _GLIBCPP_USE_WCHAR_T
+     _IO_no_init(this, 0, 0, &_M_wfile, 0);
+ #else /* !defined(_GLIBCPP_USE_WCHAR_T) */
+     _IO_no_init(this, 0, 0, NULL, 0);
+ #endif /* !defined(_GLIBCPP_USE_WCHAR_T) */
+     _IO_JUMPS((_IO_FILE_plus *) this) = &_IO_file_jumps;
+     _IO_file_init((_IO_FILE_plus*)this);
+   }
+ 
+   // NB: Unused.
+   int 
+   __basic_file<char>::overflow(int __c) 
+   { return _IO_file_overflow(this, __c); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file<char>::underflow()  
+   { return _IO_file_underflow(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file<char>::uflow()  
+   { return _IO_default_uflow(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file<char>::pbackfail(int __c) 
+   { return _IO_default_pbackfail(this, __c); }
+  
+   streamsize 
+   __basic_file<char>::xsputn(const char* __s, streamsize __n)
+   { return _IO_file_xsputn(this, __s, __n); }
+ 
+   streamoff
+   __basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 			      ios_base::openmode __mode)
+   { return _IO_file_seekoff(this, __off, __way, __mode); }
+ 
+   streamoff
+   __basic_file<char>::seekpos(streamoff __pos, ios_base::openmode __mode)
+   { return _IO_file_seekoff(this, __pos, ios_base::beg, __mode); }
+ 
+  // NB: Unused.
+   streambuf* 
+   __basic_file<char>::setbuf(char* __b, int __len)
+   { return (streambuf*) _IO_file_setbuf(this,__b, __len); }
+ 
+  int 
+   __basic_file<char>::sync()
+   { return _IO_file_sync(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file<char>::doallocate() 
+   { return _IO_file_doallocate(this); }
+ 
+   // __basic_file<wchar_t> definitions
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   __basic_file<wchar_t>::__basic_file(__c_lock* __lock)
+   {
+ #ifdef _IO_MTSAFE_IO
+     _lock = __lock;
+ #endif
+     // Don't set the orientation of the stream when initializing.
+     _IO_no_init(this, 0, 0, &_M_wfile, &_IO_wfile_jumps);
+     _IO_JUMPS((_IO_FILE_plus *) this) = &_IO_wfile_jumps;
+     _IO_file_init((_IO_FILE_plus*)this);
+ 
+     // In addition, need to allocate the buffer...
+     _IO_wdoallocbuf(this);
+     // Setup initial positions for this buffer...
+     //    if (!(_flags & _IO_NO_READS))
+     _IO_wsetg(this, _wide_data->_IO_buf_base, _wide_data->_IO_buf_base,
+ 	      _wide_data->_IO_buf_base);
+     //    if (!(_flags & _IO_NO_WRITES))
+     _IO_wsetp(this, _wide_data->_IO_buf_base, _wide_data->_IO_buf_base);
+     
+     // Setup codecvt bits...
+     _codecvt = &__c_libio_codecvt;
+     
+     // Do the same for narrow bits...
+     if (_IO_write_base == NULL)
+       {
+ 	_IO_doallocbuf(this);
+ 	//      if (!(_flags & _IO_NO_READS))
+ 	_IO_setg(this, _IO_buf_base, _IO_buf_base, _IO_buf_base);
+ 	//    if (!(_flags & _IO_NO_WRITES))
+ 	_IO_setp(this, _IO_buf_base, _IO_buf_base);
+       }
+   }
+ 
+  int 
+   __basic_file<wchar_t>::overflow(int __c) 
+   { return _IO_wfile_overflow(this, __c); }
+ 
+   int 
+   __basic_file<wchar_t>::underflow()  
+   { return _IO_wfile_underflow(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file<wchar_t>::uflow()  
+   { return _IO_wdefault_uflow(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file<wchar_t>::pbackfail(int __c) 
+   { return _IO_wdefault_pbackfail(this, __c); }
+ 
+   streamsize 
+   __basic_file<wchar_t>::xsputn(const wchar_t* __s, streamsize __n)
+   { return _IO_wfile_xsputn(this, __s, __n); }
+   
+   streamoff
+   __basic_file<wchar_t>::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 				 ios_base::openmode __mode)
+   { return _IO_wfile_seekoff(this, __off, __way, __mode); }
+ 
+   streamoff
+   __basic_file<wchar_t>::seekpos(streamoff __pos, ios_base::openmode __mode)
+   { return _IO_wfile_seekoff(this, __pos, ios_base::beg, __mode); }
+ 
+    streambuf* 
+   __basic_file<wchar_t>::setbuf(wchar_t* __b, int __len)
+   { return (streambuf*) _IO_wfile_setbuf(this,__b, __len); }
+ 
+    int 
+   __basic_file<wchar_t>::sync()
+   { return _IO_wfile_sync(this); }
+ 
+   int 
+   __basic_file<wchar_t>::doallocate() 
+   { return _IO_wfile_doallocate(this); }
+ #endif
+ 
+   // Need to instantiate base class here for type-info bits, etc
+   template struct __basic_file_base<char>;
+   template class __basic_file<char>;
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template struct __basic_file_base<wchar_t>;
+   template class __basic_file<wchar_t>;
+ #endif
+ }  // namespace std
Index: config/basic_file_stdio.h
===================================================================
RCS file: basic_file_stdio.h
diff -N basic_file_stdio.h
*** /dev/null	Tue May  5 13:32:27 1998
--- basic_file_stdio.h	Tue Feb 27 19:16:32 2001
***************
*** 0 ****
--- 1,258 ----
+ // Wrapper of C-language FILE struct -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ 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, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself 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.
+ 
+ //
+ // ISO C++ 14882: 27.8  File-based streams
+ //
+ 
+ #include <unistd.h>
+ 
+ namespace std 
+ {
+   // Generic definitions for __basic_file
+   template<typename _CharT>
+     __basic_file<_CharT>::__basic_file(__c_lock* /*__lock*/) 
+     : _M_fileno(-1), _M_cfile(NULL) { }
+ 
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::get_fileno(void)
+     { return _M_fileno; }
+  
+   template<typename _CharT>
+     __basic_file<_CharT>::~__basic_file()
+     {
+       if (this->is_open())
+ 	{
+ 	  fflush(_M_cfile);
+ 	  this->close();
+ 	}
+     }
+       
+   template<typename _CharT>
+     void 
+     __basic_file<_CharT>::_M_open_mode(ios_base::openmode __mode, 
+ 				       int& /*__p_mode*/, int& /*__rw_mode*/, 
+ 				       char* __c_mode)
+     {  
+       bool __testb = __mode & ios_base::binary;
+       bool __testi = __mode & ios_base::in;
+       bool __testo = __mode & ios_base::out;
+       bool __testt = __mode & ios_base::trunc;
+       bool __testa = __mode & ios_base::app;
+       
+       if (!__testi && __testo && !__testt && !__testa)
+ 	strcpy(__c_mode, "w");
+       if (!__testi && __testo && !__testt && __testa)
+ 	strcpy(__c_mode, "a");
+       if (!__testi && __testo && __testt && !__testa)
+ 	strcpy(__c_mode, "w");
+       if (__testi && !__testo && !__testt && !__testa)
+ 	strcpy(__c_mode, "r");
+       if (__testi && __testo && !__testt && !__testa)
+ 	strcpy(__c_mode, "r+");
+       if (__testi && __testo && __testt && !__testa)
+ 	strcpy(__c_mode, "w+");
+       if (__testb)
+ 	strcat(__c_mode, "b");
+     }
+   
+   template<typename _CharT>
+     __basic_file<_CharT>*
+     __basic_file<_CharT>::sys_open(int __fd, ios_base::openmode __mode) 
+     {
+       __basic_file* __ret = NULL;
+       int __p_mode = 0;
+       int __rw_mode = 0;
+       char __c_mode[4];
+ 
+       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
+ 
+       int __dupfd = dup(__fd);
+ 
+       if (__dupfd != -1 && !this->is_open())
+ 	{
+ 	  if ((_M_cfile = fdopen(__dupfd, __c_mode)))
+ 	    {
+ 	      _M_fileno = __dupfd;
+ 	      __ret = this;
+ 	    }
+ 	}
+ 
+       return __ret;
+     }
+   
+   template<typename _CharT>
+     __basic_file<_CharT>* 
+     __basic_file<_CharT>::open(const char* __name, ios_base::openmode __mode, 
+ 			       int /*__prot*/)
+     {
+       __basic_file* __ret = NULL;
+       int __p_mode = 0;
+       int __rw_mode = 0;
+       char __c_mode[4];
+       
+       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
+ 
+       if (!this->is_open())
+ 	{
+ 	  if ((_M_cfile = fopen(__name, __c_mode)))
+ 	    {
+ 	      _M_fileno = fileno(_M_cfile);
+ 	      __ret = this;
+ 	    }
+ 	}
+       return __ret;
+     }
+   
+   template<typename _CharT>
+     bool 
+     __basic_file<_CharT>::is_open() { return _M_fileno >= 0; }
+   
+   template<typename _CharT>
+     __basic_file<_CharT>* 
+     __basic_file<_CharT>::close()
+     { 
+       __basic_file* __retval = static_cast<__basic_file*>(NULL);
+       bool __testopen = fclose(_M_cfile);
+       if (!__testopen)
+ 	{
+ 	  __retval = this;
+ 	  _M_fileno = -1;
+ 	}  
+       return __retval;
+     }
+  
+   template<typename _CharT>
+     streamsize 
+     __basic_file<_CharT>::xsgetn(_CharT* __s, streamsize __n)
+     { return fread(__s, 1, __n, _M_cfile); }
+ 
+   template<typename _CharT>
+     streamsize 
+     __basic_file<_CharT>::xsputn(const _CharT* __s, streamsize __n)
+     { return fwrite(__s, 1, __n, _M_cfile); }
+  
+   template<typename _CharT>
+     streamoff
+     __basic_file<_CharT>::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 				  ios_base::openmode /*__mode*/)
+     { fseek(_M_cfile, __off, __way); return ftell(_M_cfile); }
+ 
+   template<typename _CharT>
+     streamoff
+     __basic_file<_CharT>::seekpos(streamoff __pos, 
+ 				  ios_base::openmode /*__mode*/)
+     { fseek(_M_cfile, __pos, ios_base::beg); return ftell(_M_cfile); }
+ 
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::sync()
+     { return fflush(_M_cfile); }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::overflow(int /*__c*/) 
+     { return EOF; }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::underflow()  
+     { return EOF; } 
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::uflow()  
+     { return EOF; }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::pbackfail(int /*__c*/) 
+     { return EOF; } 
+  
+  // NB: Unused.
+   template<typename _CharT>
+     streambuf* 
+     __basic_file<_CharT>::setbuf(_CharT* /*__b*/, int /*__len*/)
+     { return reinterpret_cast<streambuf*>(this); }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::doallocate() 
+     { return EOF; }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     streamsize 
+     __basic_file<_CharT>::sys_read(_CharT* __s, streamsize __n) 
+     { return fread(__s, 1, __n, _M_cfile); }
+ 
+   // NB: Unused.    
+   template<typename _CharT>
+     streamsize 
+     __basic_file<_CharT>::sys_write(const _CharT* __s, streamsize __n) 
+     { return fwrite(__s, 1, __n, _M_cfile); }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     streamoff
+     __basic_file<_CharT>::sys_seek(streamoff __pos, ios_base::seekdir __way)
+     { 
+       fseek(_M_cfile, __pos, __way); 
+       return ftell(_M_cfile); 
+     }
+   
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::sys_close() 
+     { return fclose(_M_cfile); }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::sys_stat(void* /*__v*/) 
+     { return EOF; }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     int 
+     __basic_file<_CharT>::showmanyc() 
+     { return EOF; }
+ 
+   // NB: Unused.
+   template<typename _CharT>
+     void 
+     __basic_file<_CharT>::imbue(void* /*__v*/) { }
+ }  // namespace std
Index: config/basic_file_stdio.cc
===================================================================
RCS file: basic_file_stdio.cc
diff -N basic_file_stdio.cc
*** /dev/null	Tue May  5 13:32:27 1998
--- basic_file_stdio.cc	Tue Feb 27 19:16:32 2001
***************
*** 0 ****
--- 1,42 ----
+ // Wrapper of C-language FILE struct -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ 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, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself 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.
+ 
+ //
+ // ISO C++ 14882: 27.8  File-based streams
+ //
+ 
+ #include <bits/basic_file.h>
+ 
+ namespace std 
+ {
+   template class __basic_file<char>;
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template class __basic_file<wchar_t>;
+ #endif
+ }  // namespace std


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]