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