epoc32/include/stdapis/stlportv5/stl/_fstream.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 2 epoc32/include/stdapis/stlport/stl/_fstream.h@2fe1408b6811
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
/*
williamr@2
     2
 * © Portions copyright (c) 2006-2007 Nokia Corporation.  All rights reserved.
williamr@2
     3
 *
williamr@2
     4
 * Copyright (c) 1999
williamr@2
     5
 * Silicon Graphics Computer Systems, Inc.
williamr@2
     6
 *
williamr@2
     7
 * Copyright (c) 1999 
williamr@2
     8
 * Boris Fomitchev
williamr@2
     9
 *
williamr@2
    10
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
    11
 * or implied. Any use is at your own risk.
williamr@2
    12
 *
williamr@2
    13
 * Permission to use or copy this software for any purpose is hereby granted 
williamr@2
    14
 * without fee, provided the above notices are retained on all copies.
williamr@2
    15
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    16
 * provided the above notices are retained, and a notice that the code was
williamr@2
    17
 * modified is included with the above copyright notice.
williamr@2
    18
 *
williamr@2
    19
 */ 
williamr@2
    20
// This header defines classes basic_filebuf, basic_ifstream,
williamr@2
    21
// basic_ofstream, and basic_fstream.  These classes represent
williamr@2
    22
// streambufs and streams whose sources or destinations are files.
williamr@2
    23
williamr@2
    24
#ifndef _STLP_INTERNAL_FSTREAM_H
williamr@2
    25
#define _STLP_INTERNAL_FSTREAM_H
williamr@2
    26
williamr@2
    27
#if defined(__sgi) && !defined(__GNUC__) && !defined(_STANDARD_C_PLUS_PLUS)
williamr@2
    28
#error This header file requires the -LANG:std option
williamr@2
    29
#endif
williamr@2
    30
williamr@2
    31
#ifndef _STLP_INTERNAL_STREAMBUF
williamr@2
    32
# include <stl/_streambuf.h>
williamr@2
    33
#endif
williamr@2
    34
williamr@2
    35
#ifndef _STLP_INTERNAL_ISTREAM_H
williamr@2
    36
#include <stl/_istream.h>
williamr@2
    37
#endif
williamr@2
    38
williamr@2
    39
#ifndef _STLP_INTERNAL_CODECVT_H
williamr@2
    40
#include <stl/_codecvt.h>
williamr@2
    41
#endif
williamr@2
    42
williamr@2
    43
#ifndef _STLP_STDIO_FILE_H
williamr@2
    44
#include <stl/_stdio_file.h>
williamr@2
    45
#endif
williamr@2
    46
williamr@2
    47
// fbp : let us map 1 MB maximum, just be sure not to trash VM
williamr@2
    48
//for hardware defining 8kb of mmap chunk
williamr@2
    49
# ifdef __SYMBIAN32__
williamr@2
    50
# define MMAP_CHUNK 0x2000UL
williamr@2
    51
# else
williamr@2
    52
# define MMAP_CHUNK 0x100000UL
williamr@2
    53
# endif
williamr@2
    54
williamr@2
    55
#if !defined (_STLP_USE_UNIX_IO) && !defined(_STLP_USE_WIN32_IO) \
williamr@2
    56
    && ! defined (_STLP_USE_UNIX_EMULATION_IO) && !defined (_STLP_USE_STDIO_IO)
williamr@2
    57
williamr@2
    58
# if defined (_STLP_UNIX)  || defined (__CYGWIN__) || defined (__amigaos__) || defined (__EMX__) || defined (__SYMBIAN32__)
williamr@2
    59
// open/close/read/write
williamr@2
    60
#  define _STLP_USE_UNIX_IO
williamr@2
    61
# elif defined (_STLP_WIN32)  && ! defined (__CYGWIN__)
williamr@2
    62
// CreateFile/ReadFile/WriteFile
williamr@2
    63
#  define _STLP_USE_WIN32_IO
williamr@2
    64
# elif defined (_STLP_WIN16) || defined (_STLP_WIN32) || defined (_STLP_MAC)
williamr@2
    65
// _open/_read/_write
williamr@2
    66
#  define _STLP_USE_UNIX_EMULATION_IO
williamr@2
    67
# else
williamr@2
    68
// fopen/fread/fwrite
williamr@2
    69
#  define _STLP_USE_STDIO_IO
williamr@2
    70
# endif /* _STLP_UNIX */
williamr@2
    71
williamr@2
    72
#endif /* mode selection */
williamr@2
    73
williamr@2
    74
williamr@2
    75
#if defined (_STLP_USE_WIN32_IO)
williamr@2
    76
typedef void* _STLP_fd;
williamr@2
    77
#elif defined (_STLP_USE_UNIX_EMULATION_IO) || defined (_STLP_USE_STDIO_IO) || defined (_STLP_USE_UNIX_IO)
williamr@2
    78
typedef int _STLP_fd;
williamr@2
    79
#else
williamr@2
    80
#error "Configure i/o !"
williamr@2
    81
#endif
williamr@2
    82
williamr@2
    83
williamr@2
    84
_STLP_BEGIN_NAMESPACE
williamr@2
    85
williamr@2
    86
#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_)
williamr@2
    87
_STLP_DECLSPEC size_t& get_fstream_Filebuf_Base_GetPageSize();
williamr@2
    88
#endif //__LIBSTD_CPP_SYMBIAN32_WSD__
williamr@2
    89
//----------------------------------------------------------------------
williamr@2
    90
// Class _Filebuf_base, a private base class to factor out the system-
williamr@2
    91
// dependent code from basic_filebuf<>.
williamr@2
    92
williamr@2
    93
class _STLP_CLASS_DECLSPEC _Filebuf_base {
williamr@2
    94
public:                      // Opening and closing files.
williamr@2
    95
  _STLP_DECLSPEC _Filebuf_base();
williamr@2
    96
williamr@2
    97
  _STLP_DECLSPEC bool _M_open(const char*, ios_base::openmode, long __protection);
williamr@2
    98
  _STLP_DECLSPEC bool _M_open(const char*, ios_base::openmode);
williamr@2
    99
  _STLP_DECLSPEC bool _M_open(int __id, ios_base::openmode = ios_base::__default_mode);
williamr@2
   100
  _STLP_DECLSPEC bool _M_close();
williamr@2
   101
williamr@2
   102
public:                      // Low-level I/O, like Unix read/write
williamr@2
   103
  _STLP_DECLSPEC ptrdiff_t _M_read(char* __buf,  ptrdiff_t __n);
williamr@2
   104
  _STLP_DECLSPEC streamoff _M_seek(streamoff __offset, ios_base::seekdir __dir);
williamr@2
   105
  _STLP_DECLSPEC streamoff _M_file_size();
williamr@2
   106
  _STLP_DECLSPEC bool _M_write(char* __buf,  ptrdiff_t __n);
williamr@2
   107
williamr@2
   108
public:                      // Memory-mapped I/O.
williamr@2
   109
  _STLP_DECLSPEC void* _M_mmap(streamoff __offset, streamoff __len);
williamr@2
   110
  _STLP_DECLSPEC void _M_unmap(void* __mmap_base, streamoff __len);
williamr@2
   111
williamr@2
   112
public:
williamr@2
   113
  // Returns a value n such that, if pos is the file pointer at the
williamr@2
   114
  // beginning of the range [first, last), pos + n is the file pointer at
williamr@2
   115
  // the end.  On many operating systems n == __last - __first.
williamr@2
   116
  // In Unix, writing n characters always bumps the file position by n.
williamr@2
   117
  // In Windows text mode, however, it bumps the file position by n + m,
williamr@2
   118
  // where m is the number of newlines in the range.  That's because an
williamr@2
   119
  // internal \n corresponds to an external two-character sequence.
williamr@2
   120
  streamoff _M_get_offset(char* __first, char* __last) {
williamr@2
   121
#if defined (_STLP_UNIX) || defined (_STLP_MAC)
williamr@2
   122
    return __last - __first;
williamr@2
   123
#else // defined (_STLP_WIN32) || defined (_STLP_WIN16) || defined (_STLP_DOS)
williamr@2
   124
    return ( (_M_openmode & ios_base::binary) != 0 )
williamr@2
   125
      ? (__last - __first)
williamr@2
   126
      : count(__first, __last, '\n') + (__last - __first);
williamr@2
   127
#endif
williamr@2
   128
  }
williamr@2
   129
williamr@2
   130
  // Returns true if we're in binary mode or if we're using an OS or file 
williamr@2
   131
  // system where there is no distinction between text and binary mode.
williamr@2
   132
  bool _M_in_binary_mode() const {
williamr@2
   133
# if defined (_STLP_UNIX) || defined (_STLP_MAC)  || defined(__BEOS__) || defined (__amigaos__) || defined (_STLP_VXWORKS_TORNADO)
williamr@2
   134
    return true;
williamr@2
   135
# elif defined (_STLP_WIN32) || defined (_STLP_WIN16) || defined (_STLP_DOS) || defined (_STLP_VM) || defined (__EMX__)
williamr@2
   136
    return (_M_openmode & ios_base::binary) != 0;
williamr@2
   137
# else 
williamr@2
   138
//#   error "Port!"
williamr@2
   139
#pragma message(" Symbian I/O stream support on progress."__FILE__)
williamr@2
   140
# endif
williamr@2
   141
  }
williamr@2
   142
williamr@2
   143
protected:                      // Static data members.
williamr@2
   144
# if !defined(__LIBSTD_CPP_SYMBIAN32_WSD__) && !defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_)
williamr@2
   145
  static size_t _M_page_size;
williamr@2
   146
#endif //__SYMBIAN32__
williamr@2
   147
williamr@2
   148
protected:                      // Data members.
williamr@2
   149
  _STLP_fd _M_file_id;
williamr@2
   150
# ifdef _STLP_USE_STDIO_IO
williamr@2
   151
  // for stdio, the whole FILE* is being kept here
williamr@2
   152
  FILE* _M_file;
williamr@2
   153
# endif
williamr@2
   154
# ifdef _STLP_USE_WIN32_IO
williamr@2
   155
  void* _M_view_id; 
williamr@2
   156
# endif
williamr@2
   157
williamr@2
   158
  ios_base::openmode _M_openmode     ;
williamr@2
   159
  unsigned char      _M_is_open      ;
williamr@2
   160
  unsigned char      _M_should_close ;
williamr@2
   161
  unsigned char      _M_regular_file ;
williamr@2
   162
williamr@2
   163
public :
williamr@2
   164
#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_)
williamr@2
   165
  static size_t  _STLP_CALL __page_size() { return get_fstream_Filebuf_Base_GetPageSize(); }
williamr@2
   166
#else
williamr@2
   167
  static size_t  _STLP_CALL __page_size() { return _M_page_size; } 
williamr@2
   168
#endif  
williamr@2
   169
  int  __o_mode() const { return (int)_M_openmode; } 
williamr@2
   170
  bool __is_open()      const { return (_M_is_open !=0 ); } 
williamr@2
   171
  bool __should_close() const { return (_M_should_close != 0); } 
williamr@2
   172
  bool __regular_file() const { return (_M_regular_file != 0); }
williamr@2
   173
  _STLP_fd __get_fd() const { return _M_file_id; }
williamr@2
   174
};
williamr@2
   175
williamr@2
   176
williamr@2
   177
williamr@2
   178
williamr@2
   179
//----------------------------------------------------------------------
williamr@2
   180
// Class basic_filebuf<>.
williamr@2
   181
williamr@2
   182
// Forward declaration of two helper classes.
williamr@2
   183
template <class _Traits> class _Noconv_input;
williamr@2
   184
_STLP_TEMPLATE_NULL
williamr@2
   185
class _Noconv_input<char_traits<char> >;
williamr@2
   186
williamr@2
   187
template <class _Traits> class _Noconv_output;
williamr@2
   188
_STLP_TEMPLATE_NULL
williamr@2
   189
class _Noconv_output< char_traits<char> >;
williamr@2
   190
williamr@2
   191
// There is a specialized version of underflow, for basic_filebuf<char>,
williamr@2
   192
// in fstream.cxx.
williamr@2
   193
williamr@2
   194
template <class _CharT, class _Traits>
williamr@2
   195
class _Underflow;
williamr@2
   196
williamr@2
   197
 _STLP_TEMPLATE_NULL class _Underflow< char, char_traits<char> >;
williamr@2
   198
williamr@2
   199
template <class _CharT, class _Traits>
williamr@2
   200
class basic_filebuf : public basic_streambuf<_CharT, _Traits>
williamr@2
   201
{
williamr@2
   202
public:                         // Types.
williamr@2
   203
  typedef _CharT                     char_type;
williamr@2
   204
  typedef typename _Traits::int_type int_type;
williamr@2
   205
  typedef typename _Traits::pos_type pos_type;
williamr@2
   206
  typedef typename _Traits::off_type off_type;
williamr@2
   207
  typedef _Traits                    traits_type;
williamr@2
   208
williamr@2
   209
  typedef typename _Traits::state_type _State_type;
williamr@2
   210
  typedef basic_streambuf<_CharT, _Traits> _Base;
williamr@2
   211
  typedef basic_filebuf<_CharT, _Traits> _Self;
williamr@2
   212
williamr@2
   213
public:                         // Constructors, destructor.
williamr@2
   214
  basic_filebuf();  
williamr@2
   215
  ~basic_filebuf();
williamr@2
   216
  
williamr@2
   217
public:                         // Opening and closing files.
williamr@2
   218
  bool is_open() const { return _M_base.__is_open(); }
williamr@2
   219
williamr@2
   220
  _Self* open(const char* __s, ios_base::openmode __m) {
williamr@2
   221
    return _M_base._M_open(__s, __m) ? this : 0;
williamr@2
   222
  }
williamr@2
   223
williamr@2
   224
# ifndef _STLP_NO_EXTENSIONS
williamr@2
   225
  // These two version of open() and file descriptor getter are extensions.
williamr@2
   226
  _Self* open(const char* __s, ios_base::openmode __m,
williamr@2
   227
		      long __protection) {
williamr@2
   228
    return _M_base._M_open(__s, __m, __protection) ? this : 0;
williamr@2
   229
  }
williamr@2
   230
  
williamr@2
   231
  _STLP_fd fd() const { return _M_base.__get_fd(); }
williamr@2
   232
williamr@2
   233
  _Self* open(int __id, ios_base::openmode _Init_mode = ios_base::__default_mode) {
williamr@2
   234
    return this->_M_open(__id, _Init_mode);
williamr@2
   235
  }
williamr@2
   236
# endif
williamr@2
   237
williamr@2
   238
  _Self* _M_open(int __id, ios_base::openmode _Init_mode = ios_base::__default_mode) {
williamr@2
   239
    return _M_base._M_open(__id, _Init_mode) ? this : 0;
williamr@2
   240
  }
williamr@2
   241
williamr@2
   242
  _Self* close();
williamr@2
   243
williamr@2
   244
protected:                      // Virtual functions from basic_streambuf.
williamr@2
   245
  virtual streamsize showmanyc();
williamr@2
   246
  virtual int_type underflow();
williamr@2
   247
williamr@2
   248
  virtual int_type pbackfail(int_type = traits_type::eof());
williamr@2
   249
  virtual int_type overflow(int_type = traits_type::eof());
williamr@2
   250
williamr@2
   251
  virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize);
williamr@2
   252
  virtual pos_type seekoff(off_type, ios_base::seekdir,
williamr@2
   253
                           ios_base::openmode = ios_base::in | ios_base::out);
williamr@2
   254
  virtual pos_type seekpos(pos_type,
williamr@2
   255
                           ios_base::openmode = ios_base::in | ios_base::out);
williamr@2
   256
williamr@2
   257
  virtual int sync();
williamr@2
   258
  virtual void imbue(const locale&);
williamr@2
   259
williamr@2
   260
#ifdef __SYMBIAN32__  
williamr@2
   261
  virtual int save_read_buffer ();
williamr@2
   262
  virtual void _change_input_mode();
williamr@2
   263
#endif
williamr@2
   264
williamr@2
   265
private:                        // Helper functions.
williamr@2
   266
williamr@2
   267
  // Precondition: we are currently in putback input mode.  Effect:
williamr@2
   268
  // switches back to ordinary input mode.
williamr@2
   269
  void _M_exit_putback_mode() {
williamr@2
   270
    this->setg(_M_saved_eback, _M_saved_gptr, _M_saved_egptr);
williamr@2
   271
    _M_in_putback_mode = false;
williamr@2
   272
  }
williamr@2
   273
  bool _M_switch_to_input_mode();
williamr@2
   274
  void _M_exit_input_mode();
williamr@2
   275
  bool _M_switch_to_output_mode();
williamr@2
   276
williamr@2
   277
  int_type _M_input_error();
williamr@2
   278
  int_type _M_underflow_aux();
williamr@2
   279
  //  friend class _Noconv_input<_Traits>;
williamr@2
   280
  //  friend class _Noconv_output<_Traits>;
williamr@2
   281
  friend class _Underflow<_CharT, _Traits>;
williamr@2
   282
williamr@2
   283
  int_type _M_output_error();
williamr@2
   284
  bool _M_unshift();
williamr@2
   285
williamr@2
   286
  bool _M_allocate_buffers(_CharT* __buf, streamsize __n);
williamr@2
   287
  bool _M_allocate_buffers();
williamr@2
   288
  void _M_deallocate_buffers();
williamr@2
   289
williamr@2
   290
  pos_type _M_seek_return(off_type __off, _State_type __state) {
williamr@2
   291
    if (__off != -1) {
williamr@2
   292
      if (_M_in_input_mode)
williamr@2
   293
        _M_exit_input_mode();
williamr@2
   294
#ifndef __SYMBIAN32__	  
williamr@2
   295
      _M_in_input_mode = false; //moved down, because setg again sets  input mode
williamr@2
   296
#endif
williamr@2
   297
      _M_in_output_mode = false;
williamr@2
   298
      _M_in_putback_mode = false;
williamr@2
   299
      _M_in_error_mode = false;
williamr@2
   300
      this->setg(0, 0, 0);
williamr@2
   301
      this->setp(0, 0);
williamr@2
   302
#ifdef __SYMBIAN32__	  
williamr@2
   303
			_M_in_input_mode = false; 
williamr@2
   304
#endif
williamr@2
   305
    }
williamr@2
   306
    
williamr@2
   307
    pos_type __result(__off);
williamr@2
   308
    __result.state(__state);
williamr@2
   309
    return __result;
williamr@2
   310
  }
williamr@2
   311
  
williamr@2
   312
  bool _M_seek_init(bool __do_unshift);
williamr@2
   313
williamr@2
   314
  void _M_setup_codecvt(const locale&);
williamr@2
   315
williamr@2
   316
private:                        // Data members used in all modes.
williamr@2
   317
williamr@2
   318
  _Filebuf_base _M_base;
williamr@2
   319
williamr@2
   320
private:                        // Locale-related information.
williamr@2
   321
williamr@2
   322
  unsigned char _M_constant_width;
williamr@2
   323
  unsigned char _M_always_noconv;
williamr@2
   324
  
williamr@2
   325
  // private:                        // Mode flags.
williamr@2
   326
  unsigned char _M_int_buf_dynamic;  // True if internal buffer is heap allocated,
williamr@2
   327
  // false if it was supplied by the user.
williamr@2
   328
  unsigned char _M_in_input_mode;
williamr@2
   329
  unsigned char _M_in_output_mode;
williamr@2
   330
  unsigned char _M_in_error_mode;
williamr@2
   331
  unsigned char _M_in_putback_mode;
williamr@2
   332
  
williamr@2
   333
  // Internal buffer: characters seen by the filebuf's clients.
williamr@2
   334
  _CharT* _M_int_buf;
williamr@2
   335
  _CharT* _M_int_buf_EOS;
williamr@2
   336
  
williamr@2
   337
  // External buffer: characters corresponding to the external file.
williamr@2
   338
  char* _M_ext_buf;
williamr@2
   339
  char* _M_ext_buf_EOS;
williamr@2
   340
williamr@2
   341
  // The range [_M_ext_buf, _M_ext_buf_converted) contains the external
williamr@2
   342
  // characters corresponding to the sequence in the internal buffer.  The
williamr@2
   343
  // range [_M_ext_buf_converted, _M_ext_buf_end) contains characters that
williamr@2
   344
  // have been read into the external buffer but have not been converted
williamr@2
   345
  // to an internal sequence.
williamr@2
   346
  char* _M_ext_buf_converted;
williamr@2
   347
  char* _M_ext_buf_end;
williamr@2
   348
williamr@2
   349
  // State corresponding to beginning of internal buffer.
williamr@2
   350
  _State_type _M_state;
williamr@2
   351
williamr@2
   352
private:                        // Data members used only in input mode.
williamr@2
   353
williamr@2
   354
  // Similar to _M_state except that it corresponds to
williamr@2
   355
  // the end of the internal buffer instead of the beginning.
williamr@2
   356
  _State_type _M_end_state;
williamr@2
   357
williamr@2
   358
  // This is a null pointer unless we are in mmap input mode.
williamr@2
   359
  void*     _M_mmap_base;
williamr@2
   360
  streamoff _M_mmap_len;
williamr@2
   361
williamr@2
   362
private:                        // Data members used only in putback mode.
williamr@2
   363
  _CharT* _M_saved_eback;
williamr@2
   364
  _CharT* _M_saved_gptr;
williamr@2
   365
  _CharT* _M_saved_egptr;
williamr@2
   366
williamr@2
   367
  typedef codecvt<_CharT, char, _State_type> _Codecvt;
williamr@2
   368
  const _Codecvt* _M_codecvt;
williamr@2
   369
williamr@2
   370
  int _M_width;                 // Width of the encoding (if constant), else 1
williamr@2
   371
  int _M_max_width;             // Largest possible width of single character.
williamr@2
   372
williamr@2
   373
williamr@2
   374
  enum { _S_pback_buf_size = 8 };
williamr@2
   375
  _CharT _M_pback_buf[_S_pback_buf_size];
williamr@2
   376
williamr@2
   377
  // for _Noconv_output
williamr@2
   378
public:
williamr@2
   379
  bool _M_write(char* __buf,  ptrdiff_t __n) {return _M_base._M_write(__buf, __n); }
williamr@2
   380
williamr@2
   381
public:
williamr@2
   382
  int_type
williamr@2
   383
  _M_do_noconv_input() {
williamr@2
   384
    _M_ext_buf_converted = _M_ext_buf_end;
williamr@2
   385
    this->setg((char_type*)_M_ext_buf, (char_type*)_M_ext_buf, (char_type*)_M_ext_buf_end);
williamr@2
   386
    return traits_type::to_int_type(*_M_ext_buf);
williamr@2
   387
  }
williamr@2
   388
};
williamr@2
   389
williamr@2
   390
# if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@2
   391
_STLP_EXPORT_TEMPLATE_CLASS basic_filebuf<char, char_traits<char> >;
williamr@2
   392
#  if ! defined (_STLP_NO_WCHAR_T)
williamr@2
   393
_STLP_EXPORT_TEMPLATE_CLASS basic_filebuf<wchar_t, char_traits<wchar_t> >;
williamr@2
   394
#  endif
williamr@2
   395
# endif /* _STLP_USE_TEMPLATE_EXPORT */
williamr@2
   396
williamr@2
   397
// public:
williamr@2
   398
// helper class.
williamr@2
   399
template <class _CharT>
williamr@2
   400
struct _Filebuf_Tmp_Buf
williamr@2
   401
{
williamr@2
   402
  _CharT* _M_ptr;
williamr@2
   403
  _Filebuf_Tmp_Buf(ptrdiff_t __n) : _M_ptr(0) { _M_ptr = new _CharT[__n]; }
williamr@2
   404
  ~_Filebuf_Tmp_Buf() { delete[] _M_ptr; }
williamr@2
   405
};
williamr@2
   406
williamr@2
   407
williamr@2
   408
//
williamr@2
   409
// This class had to be designed very carefully to work
williamr@2
   410
// with Visual C++.
williamr@2
   411
//
williamr@2
   412
template <class _Traits>
williamr@2
   413
class _Noconv_output {
williamr@2
   414
public:
williamr@2
   415
  typedef typename _Traits::char_type char_type;
williamr@2
   416
  static bool  _STLP_CALL _M_doit(basic_filebuf<char_type, _Traits >*, 
williamr@2
   417
                                  char_type*, char_type*)
williamr@2
   418
  {
williamr@2
   419
      return false; 
williamr@2
   420
  }
williamr@2
   421
};
williamr@2
   422
williamr@2
   423
_STLP_TEMPLATE_NULL
williamr@2
   424
class _STLP_CLASS_DECLSPEC _Noconv_output< char_traits<char> > {
williamr@2
   425
public:
williamr@2
   426
  static bool  _STLP_CALL
williamr@2
   427
  _M_doit(basic_filebuf<char, char_traits<char> >* __buf, 
williamr@2
   428
          char* __first, char* __last)
williamr@2
   429
  {
williamr@2
   430
    ptrdiff_t __n = __last - __first;
williamr@2
   431
    if (__buf->_M_write(__first, __n)) {
williamr@2
   432
      return true;
williamr@2
   433
    }
williamr@2
   434
    else
williamr@2
   435
      return false; 
williamr@2
   436
  }
williamr@2
   437
};
williamr@2
   438
williamr@2
   439
//----------------------------------------------------------------------
williamr@2
   440
// basic_filebuf<> helper functions.
williamr@2
   441
williamr@2
   442
williamr@2
   443
//----------------------------------------
williamr@2
   444
// Helper functions for switching between modes.
williamr@2
   445
williamr@2
   446
//
williamr@2
   447
// This class had to be designed very carefully to work
williamr@2
   448
// with Visual C++.
williamr@2
   449
//
williamr@2
   450
template <class _Traits>
williamr@2
   451
class _Noconv_input {
williamr@2
   452
public:
williamr@2
   453
  typedef typename _Traits::int_type int_type;
williamr@2
   454
  typedef typename _Traits::char_type char_type;
williamr@2
   455
williamr@2
   456
  static inline int_type _STLP_CALL
williamr@2
   457
  _M_doit(basic_filebuf<char_type, _Traits>*) 
williamr@2
   458
  {
williamr@2
   459
    return 0;
williamr@2
   460
  }
williamr@2
   461
};
williamr@2
   462
williamr@2
   463
_STLP_TEMPLATE_NULL
williamr@2
   464
class _Noconv_input<char_traits<char> > {
williamr@2
   465
public:
williamr@2
   466
  static inline int _STLP_CALL
williamr@2
   467
  _M_doit(basic_filebuf<char, char_traits<char> >* __buf)  {
williamr@2
   468
    return __buf->_M_do_noconv_input();
williamr@2
   469
  }
williamr@2
   470
};
williamr@2
   471
williamr@2
   472
// underflow() may be called for one of two reasons.  (1) We've
williamr@2
   473
// been going through the special putback buffer, and we need to move back
williamr@2
   474
// to the regular internal buffer.  (2) We've exhausted the internal buffer,
williamr@2
   475
// and we need to replentish it.  
williamr@2
   476
template <class _CharT, class _Traits>
williamr@2
   477
class _Underflow {
williamr@2
   478
public:
williamr@2
   479
  typedef typename _Traits::int_type int_type;
williamr@2
   480
  typedef _Traits                    traits_type;
williamr@2
   481
  
williamr@2
   482
  static int_type _STLP_CALL _M_doit(basic_filebuf<_CharT, _Traits>* __this);
williamr@2
   483
};
williamr@2
   484
williamr@2
   485
williamr@2
   486
// Specialization of underflow: if the character type is char, maybe
williamr@2
   487
// we can use mmap instead of read.
williamr@2
   488
_STLP_TEMPLATE_NULL
williamr@2
   489
class _STLP_CLASS_DECLSPEC _Underflow< char, char_traits<char> > {
williamr@2
   490
public:
williamr@2
   491
  typedef char_traits<char>::int_type int_type;
williamr@2
   492
  typedef char_traits<char> traits_type;
williamr@2
   493
  _STLP_DECLSPEC static  int _STLP_CALL _M_doit(basic_filebuf<char, traits_type >* __this);
williamr@2
   494
};
williamr@2
   495
williamr@2
   496
// There is a specialized version of underflow, for basic_filebuf<char>,
williamr@2
   497
// in fstream.cxx.
williamr@2
   498
williamr@2
   499
template <class _CharT, class _Traits>
williamr@2
   500
_STLP_TYPENAME_ON_RETURN_TYPE _Underflow<_CharT, _Traits>::int_type // _STLP_CALL
williamr@2
   501
 _Underflow<_CharT, _Traits>::_M_doit(basic_filebuf<_CharT, _Traits>* __this)
williamr@2
   502
{
williamr@2
   503
  if (!__this->_M_in_input_mode) {
williamr@2
   504
    if (!__this->_M_switch_to_input_mode())
williamr@2
   505
      return traits_type::eof();
williamr@2
   506
  }
williamr@2
   507
  
williamr@2
   508
  else if (__this->_M_in_putback_mode) {
williamr@2
   509
    __this->_M_exit_putback_mode();
williamr@2
   510
    if (__this->gptr() != __this->egptr()) {
williamr@2
   511
      int_type __c = traits_type::to_int_type(*__this->gptr());
williamr@2
   512
      return __c;
williamr@2
   513
    }
williamr@2
   514
  }
williamr@2
   515
  
williamr@2
   516
  return __this->_M_underflow_aux();
williamr@2
   517
}
williamr@2
   518
williamr@2
   519
#if defined( _STLP_USE_TEMPLATE_EXPORT ) && ! defined (_STLP_NO_WCHAR_T)
williamr@2
   520
_STLP_EXPORT_TEMPLATE_CLASS _Underflow<wchar_t, char_traits<wchar_t> >;
williamr@2
   521
#endif
williamr@2
   522
williamr@2
   523
williamr@2
   524
//----------------------------------------------------------------------
williamr@2
   525
// Class basic_ifstream<>
williamr@2
   526
williamr@2
   527
template <class _CharT, class _Traits>
williamr@2
   528
class basic_ifstream : public basic_istream<_CharT, _Traits>
williamr@2
   529
{
williamr@2
   530
public:                         // Types
williamr@2
   531
  typedef _CharT                     char_type;
williamr@2
   532
  typedef typename _Traits::int_type int_type;
williamr@2
   533
  typedef typename _Traits::pos_type pos_type;
williamr@2
   534
  typedef typename _Traits::off_type off_type;
williamr@2
   535
  typedef _Traits                    traits_type;
williamr@2
   536
williamr@2
   537
  typedef basic_ios<_CharT, _Traits>                _Basic_ios;
williamr@2
   538
  typedef basic_istream<_CharT, _Traits>            _Base;
williamr@2
   539
  typedef basic_filebuf<_CharT, _Traits>            _Buf;
williamr@2
   540
williamr@2
   541
public:                         // Constructors, destructor.
williamr@2
   542
williamr@2
   543
  basic_ifstream() : 
williamr@2
   544
    basic_ios<_CharT, _Traits>(),  basic_istream<_CharT, _Traits>(0), _M_buf() {
williamr@2
   545
      this->init(&_M_buf);
williamr@2
   546
  }
williamr@2
   547
williamr@2
   548
  explicit basic_ifstream(const char* __s, ios_base::openmode __mod = ios_base::in) : 
williamr@2
   549
    basic_ios<_CharT, _Traits>(),  basic_istream<_CharT, _Traits>(0),
williamr@2
   550
    _M_buf() {
williamr@2
   551
      this->init(&_M_buf);
williamr@2
   552
      if (!_M_buf.open(__s, __mod | ios_base::in))
williamr@2
   553
	this->setstate(ios_base::failbit);
williamr@2
   554
  }
williamr@2
   555
williamr@2
   556
# ifndef _STLP_NO_EXTENSIONS
williamr@2
   557
  explicit basic_ifstream(int __id, ios_base::openmode __mod = ios_base::in) : 
williamr@2
   558
    basic_ios<_CharT, _Traits>(),  basic_istream<_CharT, _Traits>(0), _M_buf() {
williamr@2
   559
    this->init(&_M_buf);
williamr@2
   560
    if (!_M_buf.open(__id, __mod | ios_base::in))
williamr@2
   561
      this->setstate(ios_base::failbit);
williamr@2
   562
  }
williamr@2
   563
  basic_ifstream(const char* __s, ios_base::openmode __m,
williamr@2
   564
		 long __protection) : 
williamr@2
   565
    basic_ios<_CharT, _Traits>(),  basic_istream<_CharT, _Traits>(0), _M_buf() {
williamr@2
   566
    this->init(&_M_buf);
williamr@2
   567
    if (!_M_buf.open(__s, __m | ios_base::in, __protection))
williamr@2
   568
      this->setstate(ios_base::failbit);  
williamr@2
   569
  }
williamr@2
   570
  
williamr@2
   571
# endif
williamr@2
   572
williamr@2
   573
  ~basic_ifstream() {}
williamr@2
   574
williamr@2
   575
public:                         // File and buffer operations.
williamr@2
   576
  basic_filebuf<_CharT, _Traits>* rdbuf() const
williamr@2
   577
    { return __CONST_CAST(_Buf*,&_M_buf); }
williamr@2
   578
williamr@2
   579
  bool is_open() {
williamr@2
   580
    return this->rdbuf()->is_open();
williamr@2
   581
  }
williamr@2
   582
williamr@2
   583
  void open(const char* __s, ios_base::openmode __mod = ios_base::in) {
williamr@2
   584
    if (!this->rdbuf()->open(__s, __mod | ios_base::in))
williamr@2
   585
      this->setstate(ios_base::failbit);
williamr@2
   586
  }
williamr@2
   587
williamr@2
   588
  void close() {
williamr@2
   589
    if (!this->rdbuf()->close())
williamr@2
   590
      this->setstate(ios_base::failbit);
williamr@2
   591
  }
williamr@2
   592
williamr@2
   593
williamr@2
   594
private:
williamr@2
   595
  basic_filebuf<_CharT, _Traits> _M_buf;
williamr@2
   596
};
williamr@2
   597
williamr@2
   598
williamr@2
   599
//----------------------------------------------------------------------
williamr@2
   600
// Class basic_ofstream<>
williamr@2
   601
williamr@2
   602
template <class _CharT, class _Traits>
williamr@2
   603
class basic_ofstream : public basic_ostream<_CharT, _Traits>
williamr@2
   604
{
williamr@2
   605
public:                         // Types
williamr@2
   606
  typedef _CharT                     char_type;
williamr@2
   607
  typedef typename _Traits::int_type int_type;
williamr@2
   608
  typedef typename _Traits::pos_type pos_type;
williamr@2
   609
  typedef typename _Traits::off_type off_type;
williamr@2
   610
  typedef _Traits                    traits_type;
williamr@2
   611
williamr@2
   612
  typedef basic_ios<_CharT, _Traits>                _Basic_ios;
williamr@2
   613
  typedef basic_ostream<_CharT, _Traits>            _Base;
williamr@2
   614
  typedef basic_filebuf<_CharT, _Traits>            _Buf;
williamr@2
   615
williamr@2
   616
public:                         // Constructors, destructor.
williamr@2
   617
  basic_ofstream() : 
williamr@2
   618
    basic_ios<_CharT, _Traits>(), 
williamr@2
   619
    basic_ostream<_CharT, _Traits>(0), _M_buf() {
williamr@2
   620
      this->init(&_M_buf);
williamr@2
   621
  }
williamr@2
   622
  explicit basic_ofstream(const char* __s, ios_base::openmode __mod = ios_base::out) 
williamr@2
   623
    : basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0),
williamr@2
   624
      _M_buf() {
williamr@2
   625
	this->init(&_M_buf);
williamr@2
   626
	if (!_M_buf.open(__s, __mod | ios_base::out))
williamr@2
   627
	  this->setstate(ios_base::failbit);
williamr@2
   628
  }
williamr@2
   629
williamr@2
   630
# ifndef _STLP_NO_EXTENSIONS
williamr@2
   631
  explicit basic_ofstream(int __id, ios_base::openmode __mod = ios_base::out) 
williamr@2
   632
    : basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0),
williamr@2
   633
    _M_buf() {
williamr@2
   634
 	this->init(&_M_buf);
williamr@2
   635
 	if (!_M_buf.open(__id, __mod | ios_base::out))
williamr@2
   636
 	  this->setstate(ios_base::failbit);
williamr@2
   637
  }
williamr@2
   638
  basic_ofstream(const char* __s, ios_base::openmode __m, long __protection) : 
williamr@2
   639
    basic_ios<_CharT, _Traits>(),  basic_ostream<_CharT, _Traits>(0), _M_buf() {
williamr@2
   640
    this->init(&_M_buf);
williamr@2
   641
    if (!_M_buf.open(__s, __m | ios_base::out, __protection))
williamr@2
   642
      this->setstate(ios_base::failbit);  
williamr@2
   643
  }
williamr@2
   644
# endif
williamr@2
   645
  
williamr@2
   646
  ~basic_ofstream() {}
williamr@2
   647
williamr@2
   648
public:                         // File and buffer operations.
williamr@2
   649
  basic_filebuf<_CharT, _Traits>* rdbuf() const
williamr@2
   650
    { return __CONST_CAST(_Buf*,&_M_buf); } 
williamr@2
   651
williamr@2
   652
  bool is_open() {
williamr@2
   653
    return this->rdbuf()->is_open();
williamr@2
   654
  }
williamr@2
   655
williamr@2
   656
  void open(const char* __s, ios_base::openmode __mod= ios_base::out) {
williamr@2
   657
    if (!this->rdbuf()->open(__s, __mod | ios_base::out))
williamr@2
   658
      this->setstate(ios_base::failbit);
williamr@2
   659
  }
williamr@2
   660
williamr@2
   661
  void close() {
williamr@2
   662
    if (!this->rdbuf()->close())
williamr@2
   663
      this->setstate(ios_base::failbit);
williamr@2
   664
  }
williamr@2
   665
williamr@2
   666
private:
williamr@2
   667
  basic_filebuf<_CharT, _Traits> _M_buf;
williamr@2
   668
};
williamr@2
   669
williamr@2
   670
williamr@2
   671
//----------------------------------------------------------------------
williamr@2
   672
// Class basic_fstream<>
williamr@2
   673
williamr@2
   674
template <class _CharT, class _Traits>
williamr@2
   675
class basic_fstream : public basic_iostream<_CharT, _Traits>
williamr@2
   676
{
williamr@2
   677
public:                         // Types
williamr@2
   678
  typedef _CharT                     char_type;
williamr@2
   679
  typedef typename _Traits::int_type int_type;
williamr@2
   680
  typedef typename _Traits::pos_type pos_type;
williamr@2
   681
  typedef typename _Traits::off_type off_type;
williamr@2
   682
  typedef _Traits                    traits_type;
williamr@2
   683
williamr@2
   684
  typedef basic_ios<_CharT, _Traits>                _Basic_ios;
williamr@2
   685
  typedef basic_iostream<_CharT, _Traits>           _Base;
williamr@2
   686
  typedef basic_filebuf<_CharT, _Traits>            _Buf;
williamr@2
   687
williamr@2
   688
public:                         // Constructors, destructor.
williamr@2
   689
  
williamr@2
   690
  _STLP_DECLSPEC basic_fstream();
williamr@2
   691
  explicit basic_fstream(const char* __s,
williamr@2
   692
                         ios_base::openmode __mod = ios_base::in | ios_base::out) :
williamr@2
   693
    basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
williamr@2
   694
      this->init(&_M_buf);
williamr@2
   695
      if (!_M_buf.open(__s, __mod))
williamr@2
   696
	this->setstate(ios_base::failbit);
williamr@2
   697
  }
williamr@2
   698
williamr@2
   699
# ifndef _STLP_NO_EXTENSIONS
williamr@2
   700
  explicit basic_fstream(int __id,
williamr@2
   701
                         ios_base::openmode __mod = ios_base::in | ios_base::out) :
williamr@2
   702
    basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
williamr@2
   703
    this->init(&_M_buf);
williamr@2
   704
    if (!_M_buf.open(__id, __mod))
williamr@2
   705
      this->setstate(ios_base::failbit);
williamr@2
   706
  }
williamr@2
   707
  basic_fstream(const char* __s, ios_base::openmode __m, long __protection) : 
williamr@2
   708
    basic_ios<_CharT, _Traits>(),  basic_iostream<_CharT, _Traits>(0), _M_buf() {
williamr@2
   709
    this->init(&_M_buf);
williamr@2
   710
    if (!_M_buf.open(__s, __m, __protection))
williamr@2
   711
      this->setstate(ios_base::failbit);  
williamr@2
   712
  }
williamr@2
   713
# endif    
williamr@2
   714
  _STLP_DECLSPEC ~basic_fstream();
williamr@2
   715
williamr@2
   716
public:                         // File and buffer operations.
williamr@2
   717
williamr@2
   718
  basic_filebuf<_CharT, _Traits>* rdbuf() const
williamr@2
   719
    { return __CONST_CAST(_Buf*,&_M_buf); } 
williamr@2
   720
williamr@2
   721
  bool is_open() {
williamr@2
   722
    return this->rdbuf()->is_open();
williamr@2
   723
  }
williamr@2
   724
williamr@2
   725
  void open(const char* __s, 
williamr@2
   726
	    ios_base::openmode __mod = 
williamr@2
   727
	    ios_base::in | ios_base::out) {
williamr@2
   728
    if (!this->rdbuf()->open(__s, __mod))
williamr@2
   729
      this->setstate(ios_base::failbit);
williamr@2
   730
  }
williamr@2
   731
williamr@2
   732
  void close() {
williamr@2
   733
    if (!this->rdbuf()->close())
williamr@2
   734
      this->setstate(ios_base::failbit);
williamr@2
   735
  }
williamr@2
   736
williamr@2
   737
private:
williamr@2
   738
  basic_filebuf<_CharT, _Traits> _M_buf;
williamr@2
   739
};
williamr@2
   740
williamr@2
   741
_STLP_END_NAMESPACE
williamr@2
   742
williamr@2
   743
# if !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@2
   744
#  include <stl/_fstream.c>
williamr@2
   745
# endif
williamr@2
   746
williamr@2
   747
_STLP_BEGIN_NAMESPACE
williamr@2
   748
williamr@2
   749
# if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@2
   750
_STLP_EXPORT_TEMPLATE_CLASS basic_ifstream<char, char_traits<char> >;
williamr@2
   751
_STLP_EXPORT_TEMPLATE_CLASS basic_ofstream<char, char_traits<char> >;
williamr@2
   752
_STLP_EXPORT_TEMPLATE_CLASS basic_fstream<char, char_traits<char> >;
williamr@2
   753
#  if ! defined (_STLP_NO_WCHAR_T)
williamr@2
   754
_STLP_EXPORT_TEMPLATE_CLASS basic_ifstream<wchar_t, char_traits<wchar_t> >;
williamr@2
   755
_STLP_EXPORT_TEMPLATE_CLASS basic_ofstream<wchar_t, char_traits<wchar_t> >;
williamr@2
   756
_STLP_EXPORT_TEMPLATE_CLASS basic_fstream<wchar_t, char_traits<wchar_t> >;
williamr@2
   757
#  endif
williamr@2
   758
# endif /* _STLP_USE_TEMPLATE_EXPORT */
williamr@2
   759
williamr@2
   760
_STLP_END_NAMESPACE
williamr@2
   761
williamr@2
   762
#endif /* _STLP_FSTREAM */
williamr@2
   763
williamr@2
   764
williamr@2
   765
// Local Variables:
williamr@2
   766
// mode:C++
williamr@2
   767
// End: