epoc32/include/stdapis/stlport/stl/_istream.c
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.
     1 /*
     2  * © Portions copyright (c) 2006-2007 Nokia Corporation.  All rights reserved.
     3  * Copyright (c) 1999
     4  * Silicon Graphics Computer Systems, Inc.
     5  *
     6  * Copyright (c) 1999
     7  * Boris Fomitchev
     8  *
     9  * This material is provided "as is", with absolutely no warranty expressed
    10  * or implied. Any use is at your own risk.
    11  *
    12  * Permission to use or copy this software for any purpose is hereby granted
    13  * without fee, provided the above notices are retained on all copies.
    14  * Permission to modify the code and to distribute modified code is granted,
    15  * provided the above notices are retained, and a notice that the code was
    16  * modified is included with the above copyright notice.
    17  *
    18  */
    19 #ifndef _STLP_ISTREAM_C
    20 #define _STLP_ISTREAM_C
    21 
    22 #ifndef _STLP_INTERNAL_ISTREAM_H
    23 # include <stl/_istream.h>
    24 #endif
    25 
    26 # if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
    27 
    28 #ifndef _STLP_LIMITS_H
    29 # include <stl/_limits.h>
    30 #endif
    31 
    32 #ifndef _STLP_INTERNAL_NUM_GET_H
    33 # include <stl/_num_get.h>
    34 #endif
    35 
    36 # if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
    37 // no wchar_t is supported for this mode
    38 # define __BIS_int_type__ int
    39 # define __BIS_pos_type__ streampos
    40 # define __BIS_off_type__ streamoff
    41 # else
    42 # define __BIS_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::int_type
    43 # define __BIS_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::pos_type
    44 # define __BIS_off_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::off_type
    45 # endif
    46 
    47 _STLP_BEGIN_NAMESPACE
    48 
    49 //----------------------------------------------------------------------
    50 // Function object structs used by some member functions.
    51 
    52 template <class _Traits>
    53 struct _Is_not_wspace {
    54   typedef typename _Traits::char_type argument_type;
    55   typedef bool                        result_type;
    56 
    57   const ctype<argument_type>* _M_ctype;
    58 
    59   _Is_not_wspace(const ctype<argument_type>* __c_type) : _M_ctype(__c_type) {}
    60   bool operator()(argument_type __c) const
    61     { return !_M_ctype->is(ctype_base::space, __c); }
    62 };
    63 
    64 template <class _Traits>
    65 struct _Is_wspace_null {
    66   typedef typename _Traits::char_type argument_type;
    67   typedef bool                        result_type;
    68 
    69   const ctype<argument_type>* _M_ctype;
    70 
    71   _Is_wspace_null(const ctype<argument_type>* __c_type) : _M_ctype(__c_type) {}
    72   bool operator()(argument_type __c) const {
    73     return _Traits::eq(__c, argument_type()) ||
    74            _M_ctype->is(ctype_base::space, __c);
    75   }
    76 };
    77 
    78 template <class _Traits>
    79 struct _Scan_for_wspace {
    80   typedef typename _Traits::char_type  char_type;
    81   typedef char_type*                   first_argument_type;
    82   typedef char_type*                   second_argument_type;
    83   typedef char_type*                   result_type;
    84 
    85   const ctype<char_type>* _M_ctype;
    86 
    87   _Scan_for_wspace(const ctype<char_type>* __ctype) : _M_ctype(__ctype) {}
    88   const char_type*
    89   operator()(const char_type* __first, const char_type* __last) const {
    90     return _M_ctype->scan_is(ctype_base::space, __first, __last);
    91   }
    92 };
    93 
    94 template <class _Traits>
    95 struct _Scan_wspace_null {
    96   typedef typename _Traits::char_type  char_type;
    97   typedef char_type*                   first_argument_type;
    98   typedef char_type*                   second_argument_type;
    99   typedef char_type*                   result_type;
   100 
   101   const ctype<char_type>* _M_ctype;
   102 
   103   _Scan_wspace_null(const ctype<char_type>* __c_type) : _M_ctype(__c_type) {}
   104   const char_type*
   105   operator()(const char_type* __first, const char_type* __last) const {
   106     __last = find_if(__first, __last,
   107                      _Eq_char_bound<_Traits>(char_type()));
   108     return _M_ctype->scan_is(ctype_base::space, __first, __last);
   109   }
   110 };
   111 
   112 template <class _Traits>
   113 struct _Scan_for_not_wspace {
   114   typedef typename _Traits::char_type  char_type;
   115   typedef char_type*                   first_argument_type;
   116   typedef char_type*                   second_argument_type;
   117   typedef char_type*                   result_type;
   118 
   119   const ctype<char_type>* _M_ctype;
   120 
   121   _Scan_for_not_wspace(const ctype<char_type>* __c_type) : _M_ctype(__c_type) {}
   122   const char_type*
   123   operator()(const char_type* __first, const char_type* __last) const {
   124     return _M_ctype->scan_not(ctype_base::space, __first, __last);
   125   }
   126 };
   127 
   128 template <class _Traits>
   129 struct _Scan_for_char_val
   130 {
   131   typedef typename _Traits::char_type char_type;
   132   typedef char_type*                  first_argument_type;
   133   typedef char_type*                  second_argument_type;
   134   typedef char_type*                  result_type;
   135 
   136   char_type _M_val;
   137 
   138   _Scan_for_char_val(char_type __val) : _M_val(__val) {}
   139 
   140   const char_type*
   141   operator()(const char_type* __first, const char_type* __last) const {
   142     return find_if(__first, __last, _Eq_char_bound<_Traits>(_M_val));
   143   }
   144 };
   145 
   146 template <class _Traits>
   147 struct _Scan_for_int_val
   148 {
   149   typedef typename _Traits::char_type char_type;
   150   typedef typename _Traits::int_type  int_type;
   151   typedef char_type*                  first_argument_type;
   152   typedef char_type*                  second_argument_type;
   153   typedef char_type*                  result_type;
   154 
   155   int_type _M_val;
   156 
   157   _Scan_for_int_val(int_type __val) : _M_val(__val) {}
   158 
   159   const char_type*
   160   operator()(const char_type* __first, const char_type* __last) const {
   161     return find_if(__first, __last,
   162                    _Eq_int_bound<_Traits>(_M_val));
   163   }
   164 };
   165 
   166 // Helper function: try to push back a character to a streambuf,
   167 // return true if the pushback succeeded.  Does not throw.
   168 
   169 template <class _CharT, class _Traits>
   170 bool _STLP_CALL
   171 __pushback(basic_streambuf<_CharT, _Traits>* __buf, _CharT __c)
   172 {
   173   bool ret;
   174   _STLP_TRY {
   175     const typename _Traits::int_type __eof = _Traits::eof();
   176     ret = !_Traits::eq_int_type(__buf->sputbackc(__c), __eof);
   177   }
   178   _STLP_CATCH_ALL {
   179     ret = false;
   180   }
   181   return ret;
   182 }
   183 
   184 template <class _CharT, class _Traits>
   185 basic_istream<_CharT, _Traits>& _STLP_CALL
   186 ws(basic_istream<_CharT, _Traits>& __is)
   187 {
   188   typedef typename basic_istream<_CharT, _Traits>::sentry      _Sentry;
   189   _Sentry __sentry(__is, _No_Skip_WS()); // Don't skip whitespace.
   190   if (__sentry)
   191     __is._M_skip_whitespace(false);
   192   return __is;
   193 }
   194 
   195 // Helper functions for istream<>::sentry constructor.
   196 template <class _CharT, class _Traits>
   197 bool
   198 _M_init_skip(basic_istream<_CharT, _Traits>& __is) {
   199   if (__is.good()) {
   200     if (__is.tie())
   201       __is.tie()->flush();
   202 
   203     __is._M_skip_whitespace(true);
   204   }
   205 
   206   if (!__is.good()) {
   207     __is.setstate(ios_base::failbit);
   208     return false;
   209   } else
   210     return true;
   211 }
   212 
   213 template <class _CharT, class _Traits>
   214 bool
   215 _M_init_noskip(basic_istream<_CharT, _Traits>& __is){
   216   if (__is.good()) {
   217     if (__is.tie())
   218       __is.tie()->flush();
   219 
   220     if (!__is.rdbuf())
   221       __is.setstate(ios_base::badbit);
   222   }
   223   else
   224     __is.setstate(ios_base::failbit);
   225   return __is.good();
   226 }
   227 
   228 //----------------------------------------------------------------------
   229 // Definitions of basic_istream<>'s noninline member functions.
   230 
   231 // Helper function for formatted input of numbers.
   232 template <class _CharT, class _Traits, class _Number>
   233 ios_base::iostate _STLP_CALL
   234 _M_get_num(basic_istream<_CharT, _Traits>& __that, _Number& __val)
   235 {
   236   typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
   237   ios_base::iostate __err = 0;
   238   _Sentry __sentry( __that );     // Skip whitespace.
   239   if (__sentry) {
   240     typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> > _Num_get;
   241     _STLP_TRY {
   242       ((const _Num_get&)use_facet<_Num_get>(__that.getloc())).get(istreambuf_iterator<_CharT, _Traits>(__that.rdbuf()),
   243 					0, __that, __err, __val);
   244     }
   245     _STLP_CATCH_ALL {
   246       __that._M_handle_exception(ios_base::badbit);
   247     }
   248     if (__err) __that.setstate(__err);
   249   }
   250   return __err;
   251 }
   252 
   253 
   254 // Unformatted input
   255 
   256 template <class _CharT, class _Traits>
   257 __BIS_int_type__
   258 basic_istream<_CharT, _Traits>::peek()
   259 {
   260   typename _Traits::int_type __tmp = _Traits::eof();
   261 
   262   this->_M_gcount = 0;
   263   sentry __sentry(*this, _No_Skip_WS());
   264 
   265   if (__sentry) {
   266     _STLP_TRY {
   267       __tmp = this->rdbuf()->sgetc();
   268     }
   269     _STLP_CATCH_ALL {
   270       this->_M_handle_exception(ios_base::badbit);
   271     }
   272   }
   273   else
   274   {
   275     if (this->_S_eof(__tmp))
   276     {
   277       this->clear();
   278       this->setstate(ios_base::eofbit);
   279     }
   280   }
   281   return __tmp;
   282 }
   283 
   284 
   285 template <class _CharT, class _Traits>
   286 __BIS_int_type__
   287 basic_istream<_CharT, _Traits>::get()
   288 {
   289   typename _Traits::int_type __tmp = _Traits::eof();
   290   sentry __sentry(*this, _No_Skip_WS());
   291   this->_M_gcount = 0;
   292 
   293   if (__sentry) {
   294     _STLP_TRY {
   295       __tmp = this->rdbuf()->sbumpc();
   296     }
   297     _STLP_CATCH_ALL {
   298       this->_M_handle_exception(ios_base::badbit);
   299     }
   300 
   301     if (!this->_S_eof(__tmp))
   302       this->_M_gcount = 1;
   303   }
   304 
   305   if (_M_gcount == 0)
   306     this->setstate(ios_base::eofbit | ios_base::failbit);
   307 
   308   return __tmp;
   309 }
   310 
   311 template <class _CharT, class _Traits>
   312 basic_istream<_CharT, _Traits>&
   313 basic_istream<_CharT, _Traits>::get(_CharT& __c)
   314 {
   315   sentry __sentry(*this, _No_Skip_WS());
   316   this->_M_gcount = 0;
   317 
   318   if (__sentry) {
   319     typename _Traits::int_type __tmp = _Traits::eof();
   320     _STLP_TRY {
   321       __tmp = this->rdbuf()->sbumpc();
   322     }
   323     _STLP_CATCH_ALL {
   324       this->_M_handle_exception(ios_base::badbit);
   325     }
   326 
   327     if (!this->_S_eof(__tmp)) {
   328       this->_M_gcount = 1;
   329       __c = _Traits::to_char_type(__tmp);
   330     }
   331   }
   332 
   333   if (this->_M_gcount == 0)
   334     this->setstate(ios_base::eofbit | ios_base::failbit);
   335 
   336   return *this;
   337 }
   338 
   339 
   340 
   341 // Read characters and discard them.  The standard specifies a single
   342 // function with two arguments, each with a default.  We instead use
   343 // three overloded functions, because it's possible to implement the
   344 // first two more efficiently than the fully general third version.
   345 template <class _CharT, class _Traits>
   346 basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore()
   347 {
   348   sentry __sentry(*this, _No_Skip_WS());
   349   this->_M_gcount = 0;
   350 
   351   if (__sentry) {
   352     int_type __c;
   353     _STLP_TRY {
   354       __c = this->rdbuf()->sbumpc();
   355     }
   356     _STLP_CATCH_ALL {
   357       this->_M_handle_exception(ios_base::badbit);
   358       return *this;
   359     }
   360 
   361     if (!this->_S_eof(__c))
   362       this->_M_gcount = 1;
   363     else
   364       this->setstate(ios_base::eofbit);
   365   }
   366 
   367   return *this;
   368 }
   369 
   370 // Putback
   371 
   372 template <class _CharT, class _Traits>
   373 basic_istream<_CharT, _Traits>&
   374 basic_istream<_CharT, _Traits>::putback(_CharT __c) {
   375   this->_M_gcount = 0;
   376   sentry __sentry(*this, _No_Skip_WS());
   377 
   378   if (__sentry) {
   379     typename _Traits::int_type __tmp = _Traits::eof();
   380     basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   381 //    if (!__buf || this->_S_eof(__buf->sputbackc(__c)))
   382     if (__buf) {
   383       _STLP_TRY {
   384         __tmp = __buf->sputbackc(__c);
   385       }
   386       _STLP_CATCH_ALL {
   387         this->_M_handle_exception(ios_base::badbit);
   388       }
   389     }
   390     if (this->_S_eof(__tmp))
   391       this->setstate(ios_base::badbit);
   392   }
   393   else
   394     this->setstate(ios_base::failbit);
   395 
   396   return *this;
   397 }
   398 
   399 template <class _CharT, class _Traits>
   400 basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() {
   401   this->_M_gcount = 0;
   402 
   403   sentry __sentry(*this, _No_Skip_WS());
   404 
   405   if (__sentry) {
   406     basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   407     //     if (!__buf || _Traits::eq_int_type(__buf->sungetc(), _Traits::eof()))
   408     if (__buf) {
   409       _STLP_TRY {
   410         _CharT __tmp;
   411         __tmp = __buf->sungetc();
   412 #ifdef 	__SYMBIAN32__
   413 	if (__tmp == (_CharT)-1) //chek for eof
   414 #else
   415         if (this->_S_eof(__tmp))
   416 #endif			
   417           this->setstate(ios_base::badbit);
   418       }
   419       _STLP_CATCH_ALL {
   420         this->_M_handle_exception(ios_base::badbit);
   421       }
   422     } else
   423       this->setstate(ios_base::badbit);
   424   }
   425   else
   426     this->setstate(ios_base::failbit);
   427 
   428   return *this;
   429 }
   430 
   431 // Positioning and buffer control.
   432 
   433 template <class _CharT, class _Traits>
   434 int basic_istream<_CharT, _Traits>::sync() {
   435   sentry __sentry(*this, _No_Skip_WS());
   436 
   437   basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   438   if (__buf) {
   439     if (__buf->pubsync() == -1) {
   440       this->setstate(ios_base::badbit);
   441       return -1;
   442     }
   443     else
   444       return 0;
   445   }
   446   else
   447     return -1;
   448 }
   449 
   450 template <class _CharT, class _Traits>
   451 __BIS_pos_type__
   452 basic_istream<_CharT, _Traits>::tellg() {
   453 #ifndef __SYMBIAN32__
   454   sentry __sentry(*this, _No_Skip_WS());
   455 #endif
   456   basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   457   return (__buf && !this->fail()) ? __buf->pubseekoff(0, ios_base::cur, ios_base::in)
   458     : pos_type(-1);
   459 }
   460 
   461 template <class _CharT, class _Traits>
   462 basic_istream<_CharT, _Traits>&
   463 basic_istream<_CharT, _Traits>::seekg(pos_type __pos) {
   464 #ifndef __SYMBIAN32__
   465   sentry __sentry(*this, _No_Skip_WS());
   466 #endif
   467   basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   468   if (!this->fail() && __buf)
   469   {
   470     pos_type pos = __buf->pubseekpos(__pos, ios_base::in);
   471     if(pos == pos_type(off_type(-1)))
   472     	this->setstate(ios_base::failbit);
   473   }
   474   return *this;
   475 }
   476 
   477 template <class _CharT, class _Traits>
   478 basic_istream<_CharT, _Traits>&
   479 basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
   480 {
   481 #ifndef __SYMBIAN32__
   482   sentry __sentry(*this, _No_Skip_WS());
   483 #endif
   484   basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   485   if (!this->fail() && __buf)
   486   {
   487 
   488     pos_type pos = __buf->pubseekoff(__off, __dir, ios_base::in);
   489     if(pos == pos_type(off_type(-1)))
   490      	this->setstate(ios_base::failbit);
   491   }
   492   return *this;
   493 }
   494 
   495 // Formatted input of characters and character arrays.
   496 
   497 template <class _CharT, class _Traits>
   498 void basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT& __c)
   499 {
   500 //  typename _Traits::int_type __tmp = _Traits::eof();
   501 
   502   sentry __sentry(*this); // Skip whitespace.
   503 
   504   if (__sentry) {
   505     typename _Traits::int_type __tmp = _Traits::eof();
   506 
   507     _STLP_TRY {
   508       __tmp = this->rdbuf()->sbumpc();
   509     }
   510     _STLP_CATCH_ALL {
   511       this->_M_handle_exception(ios_base::badbit);
   512       return;
   513     }
   514 
   515     if (!this->_S_eof(__tmp))
   516       __c = _Traits::to_char_type(__tmp);
   517     else
   518       this->setstate(ios_base::eofbit | ios_base::failbit);
   519   }
   520 }
   521 
   522 
   523 //---------------------------------------------------------------------------
   524 // istream's helper functions.
   525 
   526 // A generic function for unbuffered input.  We stop when we reach EOF,
   527 // or when we have extracted _Num characters, or when the function object
   528 // __is_delim return true.  In the last case, it extracts the character
   529 // for which __is_delim is true, if and only if __extract_delim is true.
   530 // It appends a null character to the end of the string; this means that
   531 // it may store up to _Num + 1 characters.
   532 //
   533 // __is_getline governs two corner cases: reading _Num characters without
   534 // encountering delim or eof (in which case failbit is set if __is_getline
   535 // is true); and reading _Num characters where the _Num+1'st character is
   536 // eof (in which case eofbit is set if __is_getline is true).
   537 //
   538 // It is assumed that __is_delim never throws.
   539 //
   540 // Return value is the number of characters extracted, including the
   541 // delimiter if it is extracted.  Note that the number of characaters
   542 // extracted isn't necessarily the same as the number stored.
   543 
   544 template < class _CharT, class _Traits, class _Is_Delim>
   545 streamsize _STLP_CALL
   546 _M_read_unbuffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
   547                        streamsize _Num, _CharT* __s,
   548                        _Is_Delim __is_delim,
   549                        bool __extract_delim, bool __append_null,
   550                        bool __is_getline)
   551 {
   552   streamsize __n = 0;
   553   ios_base::iostate __status = 0;
   554 
   555   typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
   556   // The operations that can potentially throw are sbumpc, snextc, and sgetc.
   557   _STLP_TRY {
   558 # if 0
   559     int_type __c = __buf->sgetc();
   560     while (true) {
   561       if (__that->_S_eof(__c)) {
   562         if (__n < _Num || __is_getline)
   563           __status |= ios_base::eofbit;
   564         break;
   565       }
   566 
   567       else if (__is_delim(__c)) {
   568         if (__extract_delim) {  // Extract and discard current character.
   569           __buf->sbumpc();
   570           ++__n;
   571         }
   572         break;
   573       }
   574 
   575       else if (__n == _Num) {
   576         if (__is_getline)
   577           __status |= ios_base::failbit;
   578         break;
   579       }
   580 
   581       *__s++ = _Traits::to_char_type(__c);
   582       ++__n;
   583       __c = __buf->snextc();
   584     }
   585 # else
   586 // int_type __c = __buf->sbumpc(); // __buf->sgetc();
   587 while (true) {
   588 
   589 int_type __c = __buf->sbumpc(); // sschwarz
   590 
   591 if (__that->_S_eof(__c)) {
   592 if (__n < _Num || __is_getline)
   593 __status |= ios_base::eofbit;
   594 break;
   595 }
   596 
   597 else if (__is_delim(__c)) {
   598 if (__extract_delim) { // Extract and discard current character.
   599 // __buf->sbumpc();
   600 ++__n;
   601 }
   602 break;
   603 }
   604 
   605 else { // regular character
   606 
   607 *__s++ = _Traits::to_char_type(__c);
   608 ++__n;
   609 
   610 }
   611 
   612 if (__n == _Num) {
   613 if (__is_getline) // didn't find delimiter as one of the _Num chars
   614 __status |= ios_base::failbit;
   615 break;
   616 }
   617 
   618 // *__s++ = _Traits::to_char_type(__c);
   619 // ++__n;
   620 
   621 }
   622 
   623 # endif
   624 
   625   }
   626   _STLP_CATCH_ALL {
   627     __that->_M_handle_exception(ios_base::badbit);
   628     *__s = _STLP_DEFAULT_CONSTRUCTED(_CharT);
   629     return __n;
   630   }
   631 
   632   if (__append_null)
   633     *__s =  _STLP_DEFAULT_CONSTRUCTED(_CharT);
   634   if (__status)
   635     __that->setstate(__status);    // This might throw.
   636   return __n;
   637 }
   638 
   639 // Much like _M_read_unbuffered, but with one additional function object:
   640 // __scan_delim(first, last) returns the first pointer p in [first, last)
   641 // such that __is_delim(p) is true.
   642 
   643 template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
   644 streamsize _STLP_CALL
   645 _M_read_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
   646                      streamsize _Num, _CharT* __s,
   647                      _Is_Delim __is_delim, _Scan_Delim __scan_delim,
   648                      bool __extract_delim, bool __append_null,
   649                      bool __is_getline)
   650 {
   651   streamsize __n = 0;
   652   ios_base::iostate __status = 0;
   653   bool __done    = false;
   654 
   655   _STLP_TRY {
   656     while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
   657       const _CharT* __first = __buf->_M_gptr();
   658       const _CharT* __last  = __buf->_M_egptr();
   659       ptrdiff_t __request = _Num - __n;
   660 
   661       const _CharT* __p  = __scan_delim(__first, __last);
   662       ptrdiff_t __chunk = (min) (ptrdiff_t(__p - __first), __request);
   663       _Traits::copy(__s, __first, __chunk);
   664       __s += __chunk;
   665       __n += __chunk;
   666       __buf->_M_gbump((int)__chunk);
   667 
   668       // We terminated by finding delim.
   669       if (__p != __last && __p - __first <= __request) {
   670         if (__extract_delim) {
   671           __n += 1;
   672           __buf->_M_gbump(1);
   673         }
   674         __done = true;
   675       }
   676 
   677       // We terminated by reading all the characters we were asked for.
   678       else if(__n == _Num) {
   679 
   680         // Find out if we have reached eof.  This matters for getline.
   681         if (__is_getline) {
   682           if (__chunk == __last - __first) {
   683             if (__that->_S_eof(__buf->sgetc()))
   684               __status |= ios_base::eofbit;
   685           }
   686           else
   687             __status |= ios_base::failbit;
   688         }
   689         __done   = true;
   690       }
   691 
   692       // The buffer contained fewer than _Num - __n characters.  Either we're
   693       // at eof, or we should refill the buffer and try again.
   694       else {
   695 	if (__that->_S_eof(__buf->sgetc())) {
   696           __status |= ios_base::eofbit;
   697           __done = true;
   698         }
   699       }
   700     } // Close the while loop.
   701   }
   702   _STLP_CATCH_ALL {
   703     __that->_M_handle_exception(ios_base::badbit);
   704     __done = true;
   705   }
   706 
   707   if (__done) {
   708     if (__append_null)
   709         *__s =  _STLP_DEFAULT_CONSTRUCTED(_CharT);
   710     if (__status != 0)
   711       __that->setstate(__status);   // This might throw.
   712     return __n;
   713   }
   714 
   715   // If execution has reached this point, then we have an empty buffer but
   716   // we have not reached eof.  What that means is that the streambuf has
   717   // decided to switch from buffered to unbuffered input.  We switch to
   718   // to _M_read_unbuffered.
   719 
   720   return __n + _M_read_unbuffered(__that,  __buf, _Num - __n, __s, __is_delim,
   721                                   __extract_delim,__append_null,__is_getline);
   722 }
   723 
   724 
   725 
   726 
   727 template <class _CharT, class _Traits>
   728 basic_istream<_CharT, _Traits>&
   729 basic_istream<_CharT, _Traits>::get(_CharT* __s, streamsize __n,
   730                                     _CharT __delim) {
   731   sentry __sentry(*this, _No_Skip_WS());
   732   this->_M_gcount = 0;
   733 
   734   if (__sentry) {
   735     if (__n > 0) {
   736       basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   737 
   738       if (__buf->egptr() != __buf->gptr())
   739         this->_M_gcount =
   740           _M_read_buffered(this,  __buf, __n - 1, __s,
   741                            _Eq_char_bound<_Traits>(__delim),
   742                            _Scan_for_char_val<_Traits>(__delim),
   743                            false, true, false);
   744       else
   745         this->_M_gcount =
   746           _M_read_unbuffered(this,  __buf, __n - 1, __s,
   747                              _Eq_char_bound<_Traits>(__delim),
   748                              false, true, false);
   749     }
   750   }
   751 #ifdef __SYMBIAN32__
   752   *(__s + this->_M_gcount) = _STLP_DEFAULT_CONSTRUCTED(_CharT);
   753 #endif //__SYMBIAN32__  
   754   if (this->_M_gcount == 0)
   755     this->setstate(ios_base::failbit);
   756 
   757   return *this;
   758 }
   759 
   760 // Getline is essentially identical to get, except that it extracts
   761 // the delimiter.
   762 template <class _CharT, class _Traits>
   763 basic_istream<_CharT, _Traits>&
   764 basic_istream<_CharT, _Traits>::getline(_CharT* __s, streamsize __n,
   765                                         _CharT __delim) {
   766   sentry __sentry(*this, _No_Skip_WS());
   767   this->_M_gcount = 0;
   768 
   769   if (__sentry) {
   770     if (__n > 0) {
   771       basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   772       this->_M_gcount = __buf->egptr() != __buf->gptr()
   773         ? _M_read_buffered(this,  __buf, __n - 1, __s,
   774                            _Eq_char_bound<_Traits>(__delim),
   775                            _Scan_for_char_val<_Traits>(__delim),
   776                            true, true, true)
   777         : _M_read_unbuffered(this,  __buf, __n - 1, __s,
   778                              _Eq_char_bound<_Traits>(__delim),
   779                              true, true, true);
   780     }
   781   }
   782 
   783   if (this->_M_gcount == 0)
   784     this->setstate(ios_base::failbit);
   785 
   786   return *this;
   787 }
   788 
   789 // Read n characters.  We don't look for any delimiter, and we don't
   790 // put in a terminating null character.
   791 template <class _CharT, class _Traits>
   792 basic_istream<_CharT, _Traits>&
   793 basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
   794 {
   795   sentry __sentry(*this, _No_Skip_WS());
   796   this->_M_gcount = 0;
   797 
   798   if (__sentry && !this->eof()) {
   799     basic_streambuf<_CharT, _Traits>*__buf = this->rdbuf();
   800     if (__buf->gptr() != __buf->egptr())
   801       _M_gcount
   802         = _M_read_buffered(this,  __buf, __n, __s,
   803                            _Constant_unary_fun<bool, int_type>(false),
   804                            _Project2nd<const _CharT*, const _CharT*>(),
   805                            false, false, false);
   806     else
   807       _M_gcount
   808         = _M_read_unbuffered(this,  __buf, __n, __s,
   809                              _Constant_unary_fun<bool, int_type>(false),
   810                              false, false, false);
   811   }
   812   else
   813     this->setstate(ios_base::failbit);
   814 
   815   if (this->eof())
   816     this->setstate(ios_base::eofbit | ios_base::failbit);
   817 
   818   return *this;
   819 }
   820 
   821 
   822 // Read n or fewer characters.  We don't look for any delimiter, and
   823 // we don't put in a terminating null character.
   824 template <class _CharT, class _Traits>
   825 streamsize
   826 basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __nmax)
   827 {
   828   sentry __sentry(*this, _No_Skip_WS());
   829   this->_M_gcount = 0;
   830 
   831   if (__sentry && !this->eof() && __nmax >= 0) {
   832 
   833     basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   834     streamsize __avail = __buf->in_avail();
   835 
   836     // fbp : isn't full-blown setstate required here ?
   837     if (__avail == -1)
   838       this->_M_setstate_nothrow(ios_base::eofbit);
   839 
   840     else if (__avail != 0) {
   841 
   842       if (__buf->gptr() != __buf->egptr())
   843         _M_gcount
   844           = _M_read_buffered(this,  __buf, (min) (__avail, __nmax), __s,
   845                              _Constant_unary_fun<bool, int_type>(false),
   846                              _Project2nd<const _CharT*, const _CharT*>(),
   847                              false, false, false);
   848       else
   849         _M_gcount
   850           = _M_read_unbuffered(this,  __buf, (min) (__avail, __nmax), __s,
   851                                _Constant_unary_fun<bool, int_type>(false),
   852                                false, false, false);
   853     }
   854   }
   855   else {
   856     // fbp : changed so that failbit is set only there, to pass Dietmar's test
   857     if (this->eof())
   858       this->setstate(ios_base::eofbit | ios_base::failbit);
   859     else
   860       {
   861       if (__nmax < 0)
   862         {
   863         basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   864         streamsize __avail = __buf->in_avail();
   865         if(__avail == -1)
   866             this->setstate(ios_base::eofbit);
   867         }
   868       else
   869         this->setstate(ios_base::failbit);
   870       }
   871   }
   872 
   873   //  if (this->eof())
   874   //    this->setstate(ios_base::eofbit | ios_base::failbit);
   875 
   876   return _M_gcount;
   877 }
   878 
   879 template <class _CharT, class _Traits>
   880 void basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT* __s)
   881 {
   882   sentry __sentry(*this); // Skip whitespace.
   883 
   884   if (__sentry) {
   885     basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
   886     streamsize __nmax = this->width() > 0
   887       ? this->width() - 1
   888       : (numeric_limits<streamsize>::max)() / sizeof(_CharT) - 1;
   889 
   890     streamsize __n = __buf->gptr() != __buf->egptr()
   891       ? _M_read_buffered(this,  __buf, __nmax, __s,
   892                          _Is_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
   893                          _Scan_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
   894 			 false, true, false)
   895       : _M_read_unbuffered(this,  __buf, __nmax, __s,
   896                            _Is_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
   897 			   false, true, false);
   898     if (__n == 0)
   899       this->setstate(ios_base::failbit);
   900   }
   901   this->width(0);
   902 }
   903 
   904 // A generic unbuffered function for ignoring characters.  We stop
   905 // when we reach EOF, or when the function object __is_delim returns
   906 // true.  In the last case, it extracts the character for which
   907 // __is_delim is true, if and only if __extract_delim is true.
   908 
   909 template < class _CharT, class _Traits, class _Is_Delim>
   910 void _STLP_CALL
   911 _M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
   912 		     basic_streambuf<_CharT, _Traits>* __buf,
   913 		     _Is_Delim __is_delim,
   914 		     bool __extract_delim, bool __set_failbit)
   915 {
   916   bool __done = false;
   917   ios_base::iostate __status = 0;
   918   typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
   919 
   920   _STLP_TRY {
   921 #ifdef __SYMBIAN32__
   922     int_type __c = __buf->sgetc();
   923     do {
   924 
   925       if (__that->_S_eof(__c)) {
   926         __done = true;
   927         __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
   928                                   : ios_base::eofbit;
   929         break;
   930       }
   931 
   932       else if (__is_delim(__c)) {
   933         __done = true;
   934         if (__extract_delim)
   935             __buf->snextc();
   936         break;
   937         
   938         }
   939       __c = __buf->snextc();        
   940       } while(!__done);
   941 #else
   942     while (!__done) {
   943       int_type __c = __buf->sbumpc();
   944 
   945       if (__that->_S_eof(__c)) {
   946         __done = true;
   947         __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
   948                                   : ios_base::eofbit;
   949       }
   950 
   951       else if (__is_delim(__c)) {
   952         __done = true;
   953         if (!__extract_delim)
   954           if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
   955             __status |= ios_base::failbit;
   956       }
   957     }
   958 #endif
   959   }
   960   _STLP_CATCH_ALL {
   961     __that->_M_handle_exception(ios_base::badbit);
   962   }
   963 
   964   __that->setstate(__status);
   965 }
   966 
   967 // A generic buffered function for ignoring characters.  Much like
   968 // _M_ignore_unbuffered, but with one additional function object:
   969 // __scan_delim(first, last) returns the first pointer p in [first,
   970 // last) such that __is_delim(p) is true.
   971 
   972 template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
   973 void _STLP_CALL
   974 _M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
   975 		   basic_streambuf<_CharT, _Traits>* __buf,
   976 		   _Is_Delim __is_delim, _Scan_Delim __scan_delim,
   977 		   bool __extract_delim, bool __set_failbit)
   978 {
   979   bool __at_eof      = false;
   980   bool __found_delim = false;
   981 
   982   _STLP_TRY {
   983     while (__buf->_M_egptr() != __buf->_M_gptr() && !__at_eof && !__found_delim) {
   984       const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
   985       __buf->_M_gbump((int)(__p - __buf->_M_gptr()));
   986 
   987       if (__p != __buf->_M_egptr()) { // We found delim, so we're done.
   988         if (__extract_delim)
   989           __buf->_M_gbump(1);
   990         __found_delim = true;
   991       }
   992 
   993       else                         // No delim.  Try to refil the buffer.
   994         __at_eof = __that->_S_eof(__buf->sgetc());
   995     }                              // Close the while loop.
   996   }
   997   _STLP_CATCH_ALL {
   998     __that->_M_handle_exception(ios_base::badbit);
   999     return;
  1000   }
  1001 
  1002   if (__at_eof) {
  1003     __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
  1004                                    : ios_base::eofbit);
  1005     return;
  1006   }
  1007   if (__found_delim)
  1008     return;
  1009 
  1010   // If execution has reached this point, then we have an empty buffer but
  1011   // we have not reached eof.  What that means is that the streambuf has
  1012   // decided to switch from a buffered to an unbuffered mode.  We switch
  1013   // to _M_ignore_unbuffered.
  1014   _M_ignore_unbuffered(__that,  __buf, __is_delim, __extract_delim, __set_failbit);
  1015 }
  1016 
  1017 // Overloaded versions of _M_ignore_unbuffered and _M_ignore_unbuffered
  1018 // with an explicit count _Num.  Return value is the number of
  1019 // characters extracted.
  1020 //
  1021 // The function object __max_chars takes two arguments, _Num and __n
  1022 // (the latter being the number of characters we have already read),
  1023 // and returns the maximum number of characters to read from the buffer.
  1024 // We parameterize _M_ignore_buffered so that we can use it for both
  1025 // bounded and unbounded input; for the former the function object should
  1026 // be minus<>, and for the latter it should return a constant maximum value.
  1027 
  1028 template < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim>
  1029 streamsize _STLP_CALL
  1030 _M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
  1031 		     basic_streambuf<_CharT, _Traits>* __buf,
  1032 		     streamsize _Num, _Max_Chars __max_chars,
  1033 		     _Is_Delim __is_delim,
  1034 		     bool __extract_delim, bool __set_failbit)
  1035 {
  1036   streamsize __n = 0;
  1037   ios_base::iostate __status = 0;
  1038   typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
  1039 
  1040   _STLP_TRY {
  1041     while (__max_chars(_Num, __n) > 0) {
  1042       int_type __c = __buf->sbumpc();
  1043 
  1044       if (__that->_S_eof(__c)) {
  1045         __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
  1046                                   : ios_base::eofbit;
  1047         break;
  1048       }
  1049 
  1050       else if (__is_delim(__c)) {
  1051         if (__extract_delim)
  1052           ++__n;
  1053         else if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
  1054           __status |= ios_base::failbit;
  1055 
  1056         break;
  1057       }
  1058       // fbp : added counter increment to pass Dietmar's test
  1059       ++__n;
  1060     }
  1061   }
  1062   _STLP_CATCH_ALL {
  1063     __that->_M_handle_exception(ios_base::badbit);
  1064   }
  1065 
  1066   if (__status)
  1067     __that->setstate(__status);   // This might throw.
  1068   return __n;
  1069 }
  1070 
  1071 template < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim, class _Scan_Delim>
  1072 streamsize _STLP_CALL
  1073 _M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
  1074 		   basic_streambuf<_CharT, _Traits>* __buf,
  1075 		   streamsize _Num,
  1076 		   _Max_Chars __max_chars,
  1077 		   _Is_Delim __is_delim, _Scan_Delim __scan_delim,
  1078 		   bool __extract_delim, bool __set_failbit)
  1079 {
  1080   streamsize __n = 0;
  1081   bool __at_eof = false;
  1082   bool __done   = false;
  1083 
  1084   _STLP_TRY {
  1085     while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
  1086       ptrdiff_t __avail = __buf->_M_egptr() - __buf->_M_gptr();
  1087       streamsize __m = __max_chars(_Num, __n);
  1088 
  1089       if (__avail >= __m) {       // We have more characters than we need.
  1090         const _CharT* __last = __buf->_M_gptr() + __m;
  1091         const _CharT* __p = __scan_delim(__buf->_M_gptr(), __last);
  1092         ptrdiff_t __chunk = __p - __buf->_M_gptr();
  1093         __n += __chunk;
  1094         __buf->_M_gbump((int)__chunk);
  1095 
  1096         if (__extract_delim && __p != __last) {
  1097           __n += 1;
  1098           __buf->_M_gbump(1);
  1099         }
  1100 
  1101         __done = true;
  1102       }
  1103 
  1104       else {
  1105         const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
  1106         ptrdiff_t __chunk = __p - __buf->_M_gptr();
  1107         __n += __chunk;
  1108         __buf->_M_gbump((int)__chunk);
  1109 
  1110         if (__p != __buf->_M_egptr()) { // We found delim.
  1111           if (__extract_delim) {
  1112             __n += 1;
  1113             __buf->_M_gbump(1);
  1114           }
  1115 
  1116           __done = true;
  1117         }
  1118 
  1119         // We didn't find delim.  Try to refill the buffer.
  1120         else if (__that->_S_eof(__buf->sgetc())) {
  1121           __done   = true;
  1122           __at_eof = true;
  1123         }
  1124       }
  1125     } // Close the while loop.
  1126   }
  1127   _STLP_CATCH_ALL {
  1128     __that->_M_handle_exception(ios_base::badbit);
  1129     return __n;
  1130   }
  1131 
  1132   if (__at_eof)
  1133     __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
  1134                                    : ios_base::eofbit);
  1135 
  1136   if (__done)
  1137     return __n;
  1138 
  1139   // If execution has reached this point, then we have an empty buffer but
  1140   // we have not reached eof.  What that means is that the streambuf has
  1141   // decided to switch from buffered to unbuffered input.  We switch to
  1142   // to _M_ignore_unbuffered.
  1143 
  1144   return __n + _M_ignore_unbuffered( __that,  __buf, _Num, __max_chars,
  1145                                     __is_delim, __extract_delim, __set_failbit);
  1146 }
  1147 
  1148 
  1149 template <class _CharT, class _Traits>
  1150 basic_istream<_CharT, _Traits>&
  1151 basic_istream<_CharT, _Traits>::ignore(streamsize __n)
  1152 {
  1153   sentry __sentry(*this, _No_Skip_WS());
  1154   this->_M_gcount = 0;
  1155 
  1156   if (__sentry) {
  1157     basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
  1158     typedef _Constant_unary_fun<bool, int_type> _Const_bool;
  1159     typedef _Constant_binary_fun<streamsize, streamsize, streamsize>
  1160       _Const_streamsize;
  1161     const streamsize __maxss = (numeric_limits<streamsize>::max)();
  1162 
  1163     if (__n == (numeric_limits<int>::max)()) {
  1164       if (__buf->gptr() != __buf->egptr())
  1165         _M_gcount
  1166           = _M_ignore_buffered(this,  __buf,
  1167                                __maxss, _Const_streamsize(__maxss),
  1168                                _Const_bool(false),
  1169                                _Project2nd<const _CharT*, const _CharT*>(),
  1170                                false, false);
  1171       else
  1172         _M_gcount = _M_ignore_unbuffered(this,  __buf,
  1173                                          __maxss, _Const_streamsize(__maxss),
  1174                                          _Const_bool(false), false, false);
  1175     }
  1176     else {
  1177       if (__buf->gptr() != __buf->egptr())
  1178         _M_gcount
  1179           = _M_ignore_buffered(this,  __buf,
  1180                                __n, minus<streamsize>(),
  1181                                _Const_bool(false),
  1182                                _Project2nd<const _CharT*, const _CharT*>(),
  1183                                false, false);
  1184       else
  1185         _M_gcount = _M_ignore_unbuffered(this,  __buf, __n, minus<streamsize>(),
  1186                                          _Const_bool(false), false, false);
  1187     }
  1188   }
  1189 
  1190   return *this;
  1191 }
  1192 
  1193 template <class _CharT, class _Traits>
  1194 basic_istream<_CharT, _Traits>&
  1195 basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __delim)
  1196 {
  1197   sentry __sentry(*this, _No_Skip_WS());
  1198   this->_M_gcount = 0;
  1199 
  1200   if (__sentry) {
  1201     basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
  1202     typedef _Constant_unary_fun<bool, int_type> _Const_bool;
  1203     typedef _Constant_binary_fun<streamsize, streamsize, streamsize>
  1204       _Const_streamsize;
  1205     const streamsize __maxss = (numeric_limits<streamsize>::max)();
  1206 
  1207     if (__n == (numeric_limits<int>::max)()) {
  1208       if (__buf->gptr() != __buf->egptr())
  1209         _M_gcount = _M_ignore_buffered(this,  __buf,
  1210                                        __maxss, _Const_streamsize(__maxss),
  1211                                        _Eq_int_bound<_Traits>(__delim),
  1212                                        _Scan_for_int_val<_Traits>(__delim),
  1213                                        true, false);
  1214       else
  1215         _M_gcount = _M_ignore_unbuffered(this,  __buf,
  1216                                          __maxss, _Const_streamsize(__maxss),
  1217                                          _Eq_int_bound<_Traits>(__delim),
  1218                                          true, false);
  1219     }
  1220     else {
  1221       if (__buf->gptr() != __buf->egptr())
  1222         _M_gcount = _M_ignore_buffered(this,  __buf,
  1223                                        __n, minus<streamsize>(),
  1224                                        _Eq_int_bound<_Traits>(
  1225                                                __delim),
  1226                                        _Scan_for_int_val<_Traits>(__delim),
  1227                                        true, false);
  1228       else
  1229         _M_gcount = _M_ignore_unbuffered(this,  __buf, __n, minus<streamsize>(),
  1230                                          _Eq_int_bound<_Traits>(__delim),
  1231                                          true, false);
  1232     }
  1233   }
  1234 
  1235   return *this;
  1236 }
  1237 
  1238 // This member function does not construct a sentry object, because
  1239 // it is called from sentry's constructor.
  1240 template <class _CharT, class _Traits>
  1241 void basic_istream<_CharT, _Traits>::_M_skip_whitespace(bool __set_failbit)
  1242 {
  1243   basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
  1244   if (!__buf)
  1245     this->setstate(ios_base::badbit);
  1246   else if (__buf->gptr() != __buf->egptr())
  1247     _M_ignore_buffered(this,  __buf,
  1248                        _Is_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
  1249                        _Scan_for_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
  1250                        false, __set_failbit);
  1251   else
  1252     _M_ignore_unbuffered(this,  __buf,
  1253                          _Is_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
  1254                          false, __set_failbit);
  1255 }
  1256 
  1257 
  1258 // This is a very simple loop that reads characters from __src and puts
  1259 // them into __dest.  It looks complicated because of the (standard-
  1260 // mandated) exception handling policy.
  1261 //
  1262 // We stop when we get an exception, when we fail to insert into the
  1263 // output streambuf, or when __is_delim is true.
  1264 
  1265 template < class _CharT, class _Traits, class _Is_Delim>
  1266 streamsize _STLP_CALL
  1267 _M_copy_unbuffered( basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
  1268 		    basic_streambuf<_CharT, _Traits>* __dest,
  1269 		    _Is_Delim __is_delim,
  1270 		    bool __extract_delim, bool __rethrow)
  1271 {
  1272   streamsize __extracted = 0;
  1273   ios_base::iostate __status = 0;
  1274   typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
  1275   int_type __c;
  1276 
  1277   _STLP_TRY {
  1278 #ifdef __SYMBIAN32__
  1279     __c = __src->sgetc();
  1280     for(;; __c =  __src->snextc()){
  1281   
  1282       // If we failed to get a character, then quit.
  1283       if (__that->_S_eof(__c)) {
  1284         __status |= ios_base::eofbit;
  1285         break;
  1286       }  
  1287       // If it's the delimiter, then quit.
  1288       else if (__is_delim(__c)) {
  1289         if (!__extract_delim)
  1290           __status |= ios_base::failbit;
  1291         break;
  1292       }
  1293       
  1294       else {
  1295       
  1296         // Try to put the character in the output streambuf.
  1297         _STLP_TRY {
  1298           if (!__that->_S_eof(__dest->sputc(__c)))
  1299             ++__extracted;
  1300           else
  1301             break;
  1302         }
  1303         _STLP_CATCH_ALL {
  1304           __status |= ios_base::failbit;
  1305           break;
  1306         }
  1307         
  1308       }
  1309 
  1310     } /* while (true) */
  1311 #else
  1312     while (true) {
  1313 
  1314       // Get a character. If there's an exception, catch and (maybe) rethrow it.
  1315       __c = __src->sbumpc();
  1316 
  1317       // If we failed to get a character, then quit.
  1318       if (__that->_S_eof(__c)) {
  1319         __status |= ios_base::eofbit;
  1320         break;
  1321       }
  1322       // If it's the delimiter, then quit.
  1323       else if (__is_delim(__c)) {
  1324         if (!__extract_delim && !__pushback(__src, _Traits::to_char_type(__c)))
  1325           __status |= ios_base::failbit;
  1326         break;
  1327       }
  1328 
  1329       else {
  1330 
  1331         // Try to put the character in the output streambuf.
  1332         bool __failed = false;
  1333         _STLP_TRY {
  1334           if (!__that->_S_eof(__dest->sputc(__c)))
  1335             ++__extracted;
  1336           else
  1337             __failed = true;
  1338         }
  1339         _STLP_CATCH_ALL {
  1340           __failed = true;
  1341         }
  1342 
  1343         // If we failed to put the character in the output streambuf, then
  1344         // try to push it back to the input streambuf.
  1345         if (__failed && !__pushback(__src, _Traits::to_char_type(__c)))
  1346           __status |= ios_base::failbit;
  1347 
  1348         // fbp : avoiding infinite loop in io-27-6-1-2-3.exp
  1349         if (__failed)
  1350           break;
  1351       }
  1352 
  1353     } /* while (true) */
  1354 #endif    
  1355   }
  1356   // fbp : this try/catch moved here in reasonable assumption
  1357   // __is_delim never throw (__pushback is guaranteed not to)
  1358   _STLP_CATCH_ALL {
  1359     // See 27.6.1.2.3, paragraph 13.
  1360     if (__rethrow && __extracted == 0)
  1361       __that->_M_handle_exception(ios_base::failbit);
  1362   }
  1363   __that->setstate(__status);
  1364   return __extracted;
  1365 }
  1366 
  1367 // Buffered copying from one streambuf to another.  We copy the characters
  1368 // in chunks, rather than one at a time.  We still have to worry about all
  1369 // of the error conditions we checked in _M_copy_unbuffered, plus one more:
  1370 // the streambuf might decide to switch from a buffered to an unbuffered mode.
  1371 
  1372 template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
  1373 streamsize _STLP_CALL
  1374 _M_copy_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
  1375                      basic_streambuf<_CharT, _Traits>* __dest,
  1376                      _Scan_Delim __scan_delim, _Is_Delim __is_delim,
  1377                      bool __extract_delim, bool __rethrow)
  1378 {
  1379   streamsize __extracted = 0;
  1380   ios_base::iostate __status = 0;
  1381   typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
  1382   int_type __c = _Traits::eof();
  1383   _CharT* __first = __src->_M_gptr();
  1384   ptrdiff_t __avail = __src->_M_egptr() - __first;
  1385   // fbp : introduced to move catch/try blocks out of the loop
  1386   bool __do_handle_exceptions;
  1387 
  1388   _STLP_TRY {
  1389     while (true) {
  1390       __do_handle_exceptions = false ;
  1391       const _CharT* __last = __scan_delim(__first, __src->_M_egptr());
  1392 
  1393       // Try to copy the entire input buffer to the output buffer.
  1394       streamsize __n = __dest->sputn(__first, __extract_delim && __last != __src->_M_egptr()
  1395                                      ? (__last - __first) + 1
  1396                                      : (__last - __first));
  1397       __src->_M_gbump((int)__n);
  1398       __extracted += __n;
  1399 
  1400       // from this on, catch() will call _M_handle_exceptions()
  1401       __do_handle_exceptions = true;
  1402 
  1403       if (__n < __avail)          // We found the delimiter, or else failed to
  1404         break;                    // copy some characters.
  1405 
  1406       __c = __src->sgetc();
  1407 
  1408       // Three possibilities: we succeeded in refilling the buffer, or
  1409       // we got EOF, or the streambuf has switched to unbuffered mode.
  1410       __first = __src->_M_gptr();
  1411       __avail = __src->_M_egptr() - __first;
  1412 
  1413       if (__avail > 0)
  1414         {}	// dwa 1/16/00 -- suppress a Metrowerks warning
  1415       else if (__that->_S_eof(__c)) {
  1416         __status |= ios_base::eofbit;
  1417         break;
  1418       }
  1419       else
  1420         return __extracted + _M_copy_unbuffered(__that,  __src, __dest, __is_delim,
  1421                                                 __extract_delim, __rethrow);
  1422     } /* while */
  1423   }
  1424 
  1425   _STLP_CATCH_ALL {
  1426     // See 27.6.1.2.3, paragraph 13.
  1427     if (__rethrow && __do_handle_exceptions &&  __extracted == 0)
  1428       __that->_M_handle_exception(ios_base::failbit);
  1429   }
  1430 
  1431   if (__status)
  1432     __that->setstate(__status);   // This might throw.
  1433   return __extracted;
  1434 }
  1435 
  1436 
  1437 
  1438 template <class _CharT, class _Traits>
  1439 basic_istream<_CharT, _Traits>&
  1440 basic_istream<_CharT, _Traits>
  1441   ::get(basic_streambuf<_CharT, _Traits>& __dest, _CharT __delim)
  1442 {
  1443   sentry __sentry(*this, _No_Skip_WS());
  1444   this->_M_gcount = 0;
  1445 
  1446   if (__sentry) {
  1447     basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
  1448 
  1449     if (__src)
  1450       this->_M_gcount = __src->egptr() != __src->gptr()
  1451         ? _M_copy_buffered(this,  __src, &__dest,
  1452                            _Scan_for_char_val<_Traits>(__delim),
  1453                            _Eq_char_bound<_Traits>(__delim),
  1454                            false, false)
  1455         : _M_copy_unbuffered(this,  __src, &__dest,
  1456                              _Eq_char_bound<_Traits>(__delim),
  1457                              false, false);
  1458   }
  1459 
  1460   if (this->_M_gcount == 0)
  1461     this->setstate(ios_base::failbit);
  1462 
  1463   return *this;
  1464 }
  1465 
  1466 // Copying characters into a streambuf.
  1467 template <class _CharT, class _Traits>
  1468 basic_istream<_CharT, _Traits>&
  1469 basic_istream<_CharT, _Traits>
  1470   ::operator>>(basic_streambuf<_CharT, _Traits>* __dest)
  1471 {
  1472   streamsize __n = 0;
  1473   typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
  1474   _Sentry __sentry(*this);
  1475   if (__sentry) {
  1476     basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
  1477     if (__src && __dest)
  1478       __n = __src->egptr() != __src->gptr()
  1479         ? _M_copy_buffered(this,  __src, __dest,
  1480                            _Project2nd<const _CharT*, const _CharT*>(),
  1481                            _Constant_unary_fun<bool, int_type>(false),
  1482                            false, true)
  1483         : _M_copy_unbuffered(this,  __src, __dest,
  1484                              _Constant_unary_fun<bool, int_type>(false),
  1485                              false, true);
  1486   }
  1487 
  1488   if (__n == 0)
  1489     this->setstate(ios_base::failbit);
  1490 
  1491   return *this;
  1492 }
  1493 
  1494 // ----------------------------------------------------------------
  1495 // basic_iostream<> class
  1496 // ----------------------------------------------------------------
  1497 
  1498 template <class _CharT, class _Traits>
  1499 _STLP_EXP_DECLSPEC basic_iostream<_CharT, _Traits>
  1500   ::basic_iostream(basic_streambuf<_CharT, _Traits>* __buf)
  1501     : basic_ios<_CharT, _Traits>(),
  1502       basic_istream<_CharT, _Traits>(__buf),
  1503       basic_ostream<_CharT, _Traits>(__buf)
  1504 {
  1505   this->init(__buf);
  1506 }
  1507 
  1508 template <class _CharT, class _Traits>
  1509 _STLP_EXP_DECLSPEC basic_iostream<_CharT, _Traits>::~basic_iostream()
  1510 {}
  1511 
  1512 
  1513 template <class _CharT, class _Traits>
  1514 _STLP_EXP_DECLSPEC basic_istream<_CharT, _Traits>
  1515     ::basic_istream(basic_streambuf<_CharT, _Traits>* __buf) :
  1516     basic_ios<_CharT, _Traits>(), _M_gcount(0) {
  1517     this->init(__buf);
  1518   }
  1519 
  1520 template <class _CharT, class _Traits>
  1521 _STLP_EXP_DECLSPEC basic_istream<_CharT, _Traits>
  1522   ::~basic_istream() {}
  1523 
  1524 
  1525 
  1526 _STLP_END_NAMESPACE
  1527 
  1528 # undef __BIS_int_type__
  1529 # undef __BIS_pos_type__
  1530 # undef __BIS_off_type__
  1531 
  1532 # endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
  1533 
  1534 #endif /* _STLP_ISTREAM_C */