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