]> gcc.gnu.org Git - gcc.git/blobdiff - libstdc++-v3/config/c_io_libio.cc
char_traits.cc: Move to ...
[gcc.git] / libstdc++-v3 / config / c_io_libio.cc
index f9a33bb8dfd31f4c8965263e546760159c866e67..1747ddb3e6d0beeb2dfde8900a1d832a8a98199c 100644 (file)
 
 #include <bits/basic_file.h>
 #include <libioP.h>
-#include <fcntl.h>             // Solaris needs for O_* macros
 
 namespace std {
-  
-  __basic_file::__basic_file(__c_lock* __lock)
-  {
-    _lock = __lock;
-    _IO_init(this, 0);     
-    _IO_file_init((_IO_FILE_plus*) this); 
-    _IO_file_attach(this, -1);
-  }
 
-  int 
-  __basic_file::get_fileno(void)
-  { return _fileno; }
+  // __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; }
  
-  __basic_file::~__basic_file()
-  {
-    if (this->is_open())
-      {
-       _IO_do_flush(this);
-       if (!(_flags & _IO_DELETE_DONT_CLOSE))
-         _IO_SYSCLOSE((_IO_FILE*)this);
-      }
-    _IO_default_finish(this, 0);
-  }
+  template<typename _CharT>
+    __basic_file<_CharT>::~__basic_file()
+    { _IO_file_finish(this, 0); }
       
-  void 
-  __basic_file::_M_open_mode(ios_base::openmode __mode, int& __p_mode, 
-                            int& __rw_mode)
-  {
+  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;
+      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)
+      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;
-      }
+      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;
+      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);
 
-  __basic_file*
-  __basic_file::sys_open(int __fd, ios_base::openmode __mode) 
-  {
-    __basic_file* __retval = NULL;
-    int __p_mode = 0;
-    int __rw_mode = _IO_NO_READS + _IO_NO_WRITES; 
+      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);
+       }
 
-    _M_open_mode(__mode, __p_mode, __rw_mode);
-    if (__fd >= 0)
-      {
-       _fileno = __fd;
-       int __mask = _IO_NO_READS + _IO_NO_WRITES + _IO_IS_APPENDING;
-       _flags = (_flags & ~__mask) | (__rw_mode & __mask);
-       _IO_link_in((_IO_FILE_plus*) this); 
-       __retval = this;
-      }
-    return __retval;
-  }
+      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); }
 
-  __basic_file* 
-  __basic_file::open(const char* __name, ios_base::openmode __mode, 
-                    int __prot = 0664)
-  {
-    __basic_file* __retval = NULL;
-    int __p_mode = 0;
-    int __rw_mode = _IO_NO_READS + _IO_NO_WRITES; 
+  // NB: Unused.
+  template<typename _CharT>
+    streamsize 
+    __basic_file<_CharT>::sys_read(_CharT* __s, streamsize __n) 
+    { return _IO_file_read(this, __s, __n); }
 
-    _M_open_mode(__mode, __p_mode, __rw_mode);
-    if (!_IO_file_is_open(this))
-      {
-#if _G_HAVE_IO_FILE_OPEN
-       __c_file_type* __f;
-       __f = _IO_file_open(this, __name, __p_mode, __prot, __rw_mode, 0);
-       _flags &= ~_IO_DELETE_DONT_CLOSE;
-       __retval = __f ? this: NULL;
-#else
-       int __fd = ::open(__name, __p_mode, __prot);
-       if (__fd >= 0)
-         {
-           _fileno = __fd;        
-           int __mask = _IO_NO_READS + _IO_NO_WRITES + _IO_IS_APPENDING;
-           _flags = (_flags & ~__mask) | (__rw_mode & __mask);
-           _IO_link_in(this);
-           __retval = this;
-         }
-#endif      
-      }
-    return __retval;
-  }
-  
-  bool 
-  __basic_file::is_open() { return _fileno >= 0; }
+  // 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); }
   
-  __basic_file* 
-  __basic_file::close()
-  { return _IO_file_close_it(this) ? static_cast<__basic_file*>(NULL) : this; }
+  // 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*/) { }
+
+  // __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::overflow(int __c) { return _IO_file_overflow(this, __c); }
+  __basic_file<char>::overflow(int __c) 
+  { return _IO_file_overflow(this, __c); }
 
   // NB: Unused.
   int 
-  __basic_file::underflow()  { return _IO_file_underflow(this); }
+  __basic_file<char>::underflow()  
+  { return _IO_file_underflow(this); }
 
   // NB: Unused.
   int 
-  __basic_file::uflow()  { return _IO_default_uflow(this); }
-  
+  __basic_file<char>::uflow()  
+  { return _IO_default_uflow(this); }
+
   // NB: Unused.
   int 
-  __basic_file::pbackfail(int __c) 
+  __basic_file<char>::pbackfail(int __c) 
   { return _IO_default_pbackfail(this, __c); }
-  
   streamsize 
-  __basic_file::xsputn(const char* __s, streamsize __n)
+  __basic_file<char>::xsputn(const char* __s, streamsize __n)
   { return _IO_file_xsputn(this, __s, __n); }
-  
-  streamsize 
-  __basic_file::xsgetn(char* __s, streamsize __n)
-  { return _IO_default_xsgetn(this, __s, __n); }
 
   streamoff
-  __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
-                       ios_base::openmode __mode)
+  __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::seekpos(streamoff __pos, ios_base::openmode __mode)
+  __basic_file<char>::seekpos(streamoff __pos, ios_base::openmode __mode)
   { return _IO_file_seekoff(this, __pos, ios_base::beg, __mode); }
 
 // NB: Unused.
+ // NB: Unused.
   streambuf* 
-  __basic_file::setbuf(char* __b, int __len)
+  __basic_file<char>::setbuf(char* __b, int __len)
   { return (streambuf*) _IO_file_setbuf(this,__b, __len); }
 
 int 
-  __basic_file::sync()
+ int 
+  __basic_file<char>::sync()
   { return _IO_file_sync(this); }
 
   // NB: Unused.
   int 
-  __basic_file::doallocate() 
+  __basic_file<char>::doallocate() 
   { return _IO_file_doallocate(this); }
 
-  // NB: Unused.
-  streamsize 
-  __basic_file::sys_read(char* __s, streamsize __n) 
-  { return _IO_file_read(this, __s, __n); }
+  // __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);
+      }
+  }
 
-  // NB: Unused.    
-  streamsize 
-  __basic_file::sys_write(const char* __s, streamsize __n) 
-  { return _IO_file_write(this, __s, __n); }
+ int 
+  __basic_file<wchar_t>::overflow(int __c) 
+  { return _IO_wfile_overflow(this, __c); }
 
-  // NB: Unused.
-  streamoff
-  __basic_file::sys_seek(streamoff __pos, ios_base::seekdir __way)
-  { return _IO_file_seek(this, __pos, __way); }
-  
-  // NB: Unused.
   int 
-  __basic_file::sys_close() { return _IO_file_close(this); }
+  __basic_file<wchar_t>::underflow()  
+  { return _IO_wfile_underflow(this); }
 
   // NB: Unused.
   int 
-  __basic_file::sys_stat(void* __v) { return _IO_file_stat(this, __v); }
+  __basic_file<wchar_t>::uflow()  
+  { return _IO_wdefault_uflow(this); }
 
   // NB: Unused.
   int 
-  __basic_file::showmanyc() { return EOF; }
+  __basic_file<wchar_t>::pbackfail(int __c) 
+  { return _IO_wdefault_pbackfail(this, __c); }
 
-  // NB: Unused.
-  void 
-  __basic_file::imbue(void* /*__v*/) { }
+  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
 
 
This page took 0.038106 seconds and 5 git commands to generate.