19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ISTREAM
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_ISTREAM
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// this block is included by _ostream.h, we include it here to lower #include level
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_INTERNAL_CWCHAR)
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cwchar.h>
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_IOS_H
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_ios.h>                  // For basic_ios<>.  Includes <iosfwd>.
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_OSTREAM_H
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_ostream.h>              // Needed as a base class of basic_iostream.
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_istreambuf_iterator.h>
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <stl/_ctraits_fns.h>    // Helper functions that allow char traits
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                // to be used as function objects.
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_TEMPLATE_EXPORT)
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Isentry;
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _No_Skip_WS {};        // Dummy class used by sentry.
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _M_init_skip(basic_istream<_CharT, _Traits>& __istr);
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _M_init_noskip(basic_istream<_CharT, _Traits>& __istr);
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//----------------------------------------------------------------------
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Class basic_istream, a class that performs formatted input through
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// a stream buffer.
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The second template parameter, _Traits, defaults to char_traits<_CharT>.
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The default is declared in header <iosfwd>, and it isn't declared here
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// because C++ language rules do not allow it to be declared twice.
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass basic_istream : virtual public basic_ios<_CharT, _Traits> {
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef basic_istream<_CharT, _Traits> _Self;
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MSVC) && (_STLP_MSVC >= 1300 && _STLP_MSVC <= 1310)
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //explicitely defined as private to avoid warnings:
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_istream(_Self const&);
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator = (_Self const&);
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                         // Types
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _CharT                     char_type;
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::int_type int_type;
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::pos_type pos_type;
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::off_type off_type;
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Traits                    traits_type;
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef basic_ios<_CharT, _Traits>     _Basic_ios;
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&);
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&);
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Self& (_STLP_CALL *__istream_fn)(_Self&);
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Constructor and destructor.
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit basic_istream(basic_streambuf<_CharT, _Traits>* __buf) :
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_ios<_CharT, _Traits>(), _M_gcount(0) {
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->init(__buf);
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~basic_istream() {};
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Nested sentry class.
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Hooks for manipulators.  The arguments are
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                // function pointers.
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (__istream_fn __f) { return __f(*this); }
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (__ios_fn __f) {  __f(*this); return *this; }
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (__ios_base_fn __f) { __f(*this); return *this; }
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Formatted input of numbers.
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (short& __val);
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (int& __val);
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (unsigned short& __val);
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (unsigned int& __val);
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (long& __val);
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (unsigned long& __val);
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_LONG_LONG
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (_STLP_LONG_LONG& __val);
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (unsigned _STLP_LONG_LONG& __val);
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (float& __val);
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (double& __val);
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_NO_LONG_DOUBLE
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (long double& __val);
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_NO_BOOL
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (bool& __val);
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>> (void*& __val);
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Copying characters into a streambuf.
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator>>(basic_streambuf<_CharT, _Traits>*);
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Unformatted input.
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize gcount() const { return _M_gcount; }
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int_type peek();
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // get() for single characters
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int_type get();
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& get(char_type& __c);
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // get() for character arrays.
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& get(char_type* __s, streamsize __n, char_type __delim);
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& get(char_type* __s, streamsize __n)
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return get(__s, __n, this->widen('\n')); }
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // get() for streambufs
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& get(basic_streambuf<_CharT, _Traits>& __buf,
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     char_type __delim);
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& get(basic_streambuf<_CharT, _Traits>& __buf)
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return get(__buf, this->widen('\n')); }
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // getline()
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& getline(char_type* __s, streamsize __n, char_type delim);
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& getline(char_type* __s, streamsize __n)
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return getline(__s, __n, this->widen('\n')); }
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // read(), readsome(), ignore()
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& ignore();
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& ignore(streamsize __n);
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& ignore(streamsize __n, int_type __delim);
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& read(char_type* __s, streamsize __n);
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize readsome(char_type* __s, streamsize __n);
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // putback
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& putback(char_type __c);
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& unget();
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Positioning and buffer control.
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int sync();
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  pos_type tellg();
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& seekg(pos_type __pos);
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& seekg(off_type, ios_base::seekdir);
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Helper functions for non-member extractors.
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_formatted_get(_CharT& __c);
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_formatted_get(_CharT* __s);
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_skip_whitespace(bool __set_failbit);
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:                        // Number of characters extracted by the
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize _M_gcount;         // most recent unformatted input function.
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_TEMPLATE_EXPORT)
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If we are using DLL specs, we have not to use inner classes
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // end class declaration here
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Isentry<_CharT, _Traits>      sentry;
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define sentry _Isentry
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Isentry {
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Isentry<_CharT, _Traits> _Self;
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  class sentry {
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef sentry _Self;
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  private:
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const bool _M_ok;
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //    basic_streambuf<_CharT, _Traits>* _M_buf;
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  public:
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef _Traits traits_type;
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    explicit sentry(basic_istream<_CharT, _Traits>& __istr,
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    bool __noskipws = false) :
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_ok((__noskipws || !(__istr.flags() & ios_base::skipws)) ? _M_init_noskip(__istr) : _M_init_skip(__istr) )
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      /* , _M_buf(__istr.rdbuf()) */
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      {}
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // Calling this constructor is the same as calling the previous one with
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // __noskipws = true, except that it doesn't require a runtime test.
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    sentry(basic_istream<_CharT, _Traits>& __istr, _No_Skip_WS) : /* _M_buf(__istr.rdbuf()), */
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_ok(_M_init_noskip(__istr)) {}
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ~sentry() {}
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    operator bool() const { return _M_ok; }
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  private:                        // Disable assignment and copy constructor.
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //Implementation is here only to avoid warning with some compilers.
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    sentry(const _Self&) : _M_ok(false) {}
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self& operator=(const _Self&) { return *this; }
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  };
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (_STLP_USE_TEMPLATE_EXPORT)
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef sentry
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // close basic_istream class definition here
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (_STLP_USE_TEMPLATE_EXPORT)
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS _Isentry<char, char_traits<char> >;
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS basic_istream<char, char_traits<char> >;
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if ! defined (_STLP_NO_WCHAR_T)
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS _Isentry<wchar_t, char_traits<wchar_t> >;
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS basic_istream<wchar_t, char_traits<wchar_t> >;
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif /* _STLP_USE_TEMPLATE_EXPORT */
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Non-member character and string extractor functions.
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline basic_istream<_CharT, _Traits>& _STLP_CALL
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<_CharT, _Traits>& __in_str, _CharT& __c) {
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __in_str._M_formatted_get(__c);
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __in_str;
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline basic_istream<char, _Traits>& _STLP_CALL
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<char, _Traits>& __in_str, unsigned char& __c) {
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __in_str._M_formatted_get(__REINTERPRET_CAST(char&,__c));
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __in_str;
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline basic_istream<char, _Traits>& _STLP_CALL
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<char, _Traits>& __in_str, signed char& __c) {
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __in_str._M_formatted_get(__REINTERPRET_CAST(char&,__c));
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __in_str;
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline basic_istream<_CharT, _Traits>& _STLP_CALL
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<_CharT, _Traits>& __in_str, _CharT* __s) {
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __in_str._M_formatted_get(__s);
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __in_str;
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline basic_istream<char, _Traits>& _STLP_CALL
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<char, _Traits>& __in_str, unsigned char* __s) {
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __in_str._M_formatted_get(__REINTERPRET_CAST(char*,__s));
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __in_str;
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline basic_istream<char, _Traits>& _STLP_CALL
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<char, _Traits>& __in_str, signed char* __s) {
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __in_str._M_formatted_get(__REINTERPRET_CAST(char*,__s));
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __in_str;
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//----------------------------------------------------------------------
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// istream manipulator.
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& _STLP_CALL
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockws(basic_istream<_CharT, _Traits>& __istr) {
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!__istr.eof()) {
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename basic_istream<_CharT, _Traits>::sentry      _Sentry;
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Sentry __sentry(__istr, _No_Skip_WS()); // Don't skip whitespace.
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__sentry)
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __istr._M_skip_whitespace(false);
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __istr;
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Helper functions for istream<>::sentry constructor.
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _M_init_skip(basic_istream<_CharT, _Traits>& __istr) {
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__istr.good()) {
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__istr.tie())
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __istr.tie()->flush();
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __istr._M_skip_whitespace(true);
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!__istr.good()) {
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __istr.setstate(ios_base::failbit);
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  } else
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return true;
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _M_init_noskip(basic_istream<_CharT, _Traits>& __istr) {
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__istr.good()) {
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__istr.tie())
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __istr.tie()->flush();
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!__istr.rdbuf())
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __istr.setstate(ios_base::badbit);
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __istr.setstate(ios_base::failbit);
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __istr.good();
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//----------------------------------------------------------------------
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Class iostream.
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass basic_iostream
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public basic_istream<_CharT, _Traits>,
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    public basic_ostream<_CharT, _Traits>
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef basic_ios<_CharT, _Traits> _Basic_ios;
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __buf);
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  virtual ~basic_iostream();
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (_STLP_USE_TEMPLATE_EXPORT)
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS basic_iostream<char, char_traits<char> >;
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if ! defined (_STLP_NO_WCHAR_T)
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS basic_iostream<wchar_t, char_traits<wchar_t> >;
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif /* _STLP_USE_TEMPLATE_EXPORT */
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_istreambuf(basic_istream<_CharT, _Traits>& __istr)
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __istr.rdbuf(); }
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_istream.c>
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_ISTREAM */
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
360