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