111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Iostreams base classes -*- C++ -*-
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 1997-2014 Free Software Foundation, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library.  This library is free
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option)
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful,
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program;
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file bits/basic_ios.h
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  This is an internal header file, included by other library headers.
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Do not attempt to use it directly. @headername{ios}
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _BASIC_IOS_H
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _BASIC_IOS_H 1
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#pragma GCC system_header
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/localefwd.h>
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/locale_classes.h>
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/locale_facets.h>
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/streambuf_iterator.h>
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Facet>
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline const _Facet&
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __check_facet(const _Facet* __f)
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (!__f)
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__throw_bad_cast();
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *__f;
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief Template class basic_ios, virtual base class for all
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  stream classes.
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup io
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @tparam _CharT  Type of character stream.
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @tparam _Traits  Traits for character type, defaults to
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *                   char_traits<_CharT>.
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Most of the member functions called dispatched on stream objects
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  (e.g., @c std::cout.foo(bar);) are consolidated in this class.
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _Traits>
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class basic_ios : public ios_base
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  These are standard types.  They permit a standardized way of
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  referring to names of (or names dependent on) the template
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  parameters, which are specific to the implementation.
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT                                 char_type;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _Traits::int_type             int_type;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _Traits::pos_type             pos_type;
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _Traits::off_type             off_type;
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _Traits                                traits_type;
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  These are non-standard types.
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef ctype<_CharT>                          __ctype_type;
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert						     __num_put_type;
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert						     __num_get_type;
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Data members:
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_ostream<_CharT, _Traits>*                _M_tie;
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mutable char_type                              _M_fill;
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mutable bool                                   _M_fill_init;
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_streambuf<_CharT, _Traits>*              _M_streambuf;
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Cached use_facet<ctype>, which is based on the current locale info.
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const __ctype_type*                            _M_ctype;
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // For ostream.
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const __num_put_type*                          _M_num_put;
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // For istream.
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const __num_get_type*                          _M_num_get;
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  The quick-and-easy status check.
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This allows you to write constructs such as
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  <code>if (!a_stream) ...</code> and <code>while (a_stream) ...</code>
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator void*() const
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator!() const
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->fail(); }
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Returns the error state of the stream buffer.
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  A bit pattern (well, isn't everything?)
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  See std::ios_base::iostate for the possible bit values.  Most
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  users will call one of the interpreting wrappers, e.g., good().
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iostate
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      rdstate() const
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_streambuf_state; }
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  [Re]sets the error state.
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __state  The new state flag(s) to set.
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  See std::ios_base::iostate for the possible bit values.  Most
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  users will not need to pass an argument.
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      clear(iostate __state = goodbit);
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Sets additional flags in the error state.
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __state  The additional state flag(s) to set.
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  See std::ios_base::iostate for the possible bit values.
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      setstate(iostate __state)
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { this->clear(this->rdstate() | __state); }
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Flip the internal state on for the proper state bits, then re
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // throws the propagated exception if bit also set in
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // exceptions().
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_setstate(iostate __state)
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// 27.6.1.2.1 Common requirements.
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// Turn this on without causing an ios::failure to be thrown.
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_streambuf_state |= __state;
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (this->exceptions() & __state)
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Fast error checking.
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  True if no error flags are set.
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  A wrapper around rdstate.
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      good() const
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->rdstate() == 0; }
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Fast error checking.
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  True if the eofbit is set.
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Note that other iostate flags may also be set.
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      eof() const
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (this->rdstate() & eofbit) != 0; }
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Fast error checking.
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  True if either the badbit or the failbit is set.
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Checking the badbit in fail() is historical practice.
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Note that other iostate flags may also be set.
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      fail() const
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (this->rdstate() & (badbit | failbit)) != 0; }
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Fast error checking.
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  True if the badbit is set.
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Note that other iostate flags may also be set.
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bad() const
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (this->rdstate() & badbit) != 0; }
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Throwing exceptions on errors.
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The current exceptions mask.
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This changes nothing in the stream.  See the one-argument version
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  of exceptions(iostate) for the meaning of the return value.
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iostate
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      exceptions() const
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_exception; }
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Throwing exceptions on errors.
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __except  The new exceptions mask.
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  By default, error flags are set silently.  You can set an
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  exceptions mask for each stream; if a bit in the mask becomes set
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  in the error flags, then an exception of type
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  std::ios_base::failure is thrown.
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If the error flag is already set when the exceptions mask is
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  added, the exception is immediately thrown.  Try running the
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  following under GCC 3.1 or later:
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @code
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  #include <iostream>
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  #include <fstream>
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  #include <exception>
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  int main()
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  {
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *      std::set_terminate (__gnu_cxx::__verbose_terminate_handler);
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *      std::ifstream f ("/etc/motd");
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *      std::cerr << "Setting badbit\n";
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *      f.setstate (std::ios_base::badbit);
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *      std::cerr << "Setting exception mask\n";
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *      f.exceptions (std::ios_base::badbit);
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  }
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @endcode
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      exceptions(iostate __except)
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _M_exception = __except;
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->clear(_M_streambuf_state);
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Constructor/destructor:
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Constructor performs initialization.
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The parameter is passed by derived streams.
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_ctype(0), _M_num_put(0), _M_num_get(0)
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { this->init(__sb); }
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Empty.
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The destructor does nothing.  More specifically, it does not
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  destroy the streambuf held by rdbuf().
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~basic_ios() { }
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Members:
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Fetches the current @e tied stream.
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  A pointer to the tied stream, or NULL if the stream is
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *           not tied.
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  A stream may be @e tied (or synchronized) to a second output
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  stream.  When this stream performs any I/O, the tied stream is
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  first flushed.  For example, @c std::cin is tied to @c std::cout.
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_ostream<_CharT, _Traits>*
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      tie() const
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_tie; }
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Ties this stream to an output stream.
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tiestr  The output stream.
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The previously tied output stream, or NULL if the stream
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *           was not tied.
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This sets up a new tie; see tie() for more.
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_ostream<_CharT, _Traits>*
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      tie(basic_ostream<_CharT, _Traits>* __tiestr)
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        basic_ostream<_CharT, _Traits>* __old = _M_tie;
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _M_tie = __tiestr;
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return __old;
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Accessing the underlying buffer.
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The current stream buffer.
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This does not change the state of the stream.
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_streambuf<_CharT, _Traits>*
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      rdbuf() const
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_streambuf; }
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Changing the underlying buffer.
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __sb  The new stream buffer.
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The previous stream buffer.
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Associates a new buffer with the current stream, and clears the
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  error state.
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Due to historical accidents which the LWG refuses to correct, the
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  I/O library suffers from a design error:  this function is hidden
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  in derived classes by overrides of the zero-argument @c rdbuf(),
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  which is non-virtual for hysterical raisins.  As a result, you
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  must use explicit qualifications to access this function via any
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  derived class.  For example:
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @code
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  std::fstream     foo;         // or some other derived type
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  std::streambuf*  p = .....;
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  foo.ios::rdbuf(p);            // ios == basic_ios<char>
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @endcode
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_streambuf<_CharT, _Traits>*
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Copies fields of __rhs into this.
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __rhs  The source values for the copies.
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Reference to this object.
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  All fields of __rhs are copied into this object except that rdbuf()
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  and rdstate() remain unchanged.  All values in the pword and iword
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  arrays are copied.  Before copying, each callback is invoked with
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  erase_event.  After copying, each (new) callback is invoked with
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  copyfmt_event.  The final step is to copy exceptions().
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_ios&
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      copyfmt(const basic_ios& __rhs);
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Retrieves the @a empty character.
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The current fill character.
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  It defaults to a space (' ') in the current locale.
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      char_type
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      fill() const
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (!_M_fill_init)
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  {
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    _M_fill = this->widen(' ');
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    _M_fill_init = true;
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  }
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_fill;
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Sets a new @a empty character.
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __ch  The new character.
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The previous fill character.
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The fill character is used to fill out space when P+ characters
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  have been requested (e.g., via setw), Q characters are actually
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  used, and Q<P.  It defaults to a space (' ') in the current locale.
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      char_type
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      fill(char_type __ch)
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	char_type __old = this->fill();
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_fill = __ch;
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return __old;
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Locales:
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Moves to a new locale.
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __loc  The new locale.
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The previous locale.
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Calls @c ios_base::imbue(loc), and if a stream buffer is associated
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  with this stream, calls that buffer's @c pubimbue(loc).
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Additional l10n notes are at
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      locale
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      imbue(const locale& __loc);
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Squeezes characters.
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __c  The character to narrow.
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __dfault  The character to narrow.
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The narrowed character.
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Maps a character of @c char_type to a character of @c char,
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  if possible.
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns the result of
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @code
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *    std::use_facet<ctype<char_type> >(getloc()).narrow(c,dfault)
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @endcode
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Additional l10n notes are at
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      char
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      narrow(char_type __c, char __dfault) const
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __check_facet(_M_ctype).narrow(__c, __dfault); }
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Widens characters.
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __c  The character to widen.
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  The widened character.
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Maps a character of @c char to a character of @c char_type.
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns the result of
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @code
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *    std::use_facet<ctype<char_type> >(getloc()).widen(c)
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @endcode
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Additional l10n notes are at
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      char_type
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      widen(char __c) const
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __check_facet(_M_ctype).widen(__c); }
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // 27.4.5.1  basic_ios constructors
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Empty.
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The default constructor does nothing and is not normally
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  accessible to users.
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      basic_ios()
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false),
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  All setup is performed here.
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is called from the public constructor.  It is not virtual and
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  cannot be redefined.
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      init(basic_streambuf<_CharT, _Traits>* __sb);
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_cache_locale(const locale& __loc);
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/basic_ios.tcc>
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _BASIC_IOS_H */
478