1/*
2 * Copyright (c) 1999
3 * Silicon Graphics Computer Systems, Inc.
4 *
5 * Copyright (c) 1999
6 * Boris Fomitchev
7 *
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
10 *
11 * Permission to use or copy this software for any purpose is hereby granted
12 * without fee, provided the above notices are retained on all copies.
13 * Permission to modify the code and to distribute modified code is granted,
14 * provided the above notices are retained, and a notice that the code was
15 * modified is included with the above copyright notice.
16 *
17 */
18#ifndef _STLP_IOS_C
19#define _STLP_IOS_C
20
21#ifndef _STLP_INTERNAL_IOS_H
22# include <stl/_ios.h>
23#endif
24
25#ifndef _STLP_INTERNAL_STREAMBUF
26# include <stl/_streambuf.h>
27#endif
28
29#ifndef _STLP_INTERNAL_NUMPUNCT_H
30# include <stl/_numpunct.h>
31#endif
32
33_STLP_BEGIN_NAMESPACE
34
35// basic_ios<>'s non-inline member functions
36
37// Public constructor, taking a streambuf.
38template <class _CharT, class _Traits>
39basic_ios<_CharT, _Traits>
40  ::basic_ios(basic_streambuf<_CharT, _Traits>* __streambuf)
41    : ios_base(), _M_cached_ctype(0),
42      _M_fill(_STLP_NULL_CHAR_INIT(_CharT)), _M_streambuf(0), _M_tied_ostream(0) {
43  basic_ios<_CharT, _Traits>::init(__streambuf);
44}
45
46template <class _CharT, class _Traits>
47basic_streambuf<_CharT, _Traits>*
48basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __buf) {
49  basic_streambuf<_CharT, _Traits>* __tmp = _M_streambuf;
50  _M_streambuf = __buf;
51  this->clear();
52  return __tmp;
53}
54
55template <class _CharT, class _Traits>
56basic_ios<_CharT, _Traits>&
57basic_ios<_CharT, _Traits>::copyfmt(const basic_ios<_CharT, _Traits>& __x) {
58  _M_invoke_callbacks(erase_event);
59  _M_copy_state(__x);           // Inherited from ios_base.
60  _M_cached_ctype = __x._M_cached_ctype;
61  _M_fill = __x._M_fill;
62  _M_tied_ostream = __x._M_tied_ostream;
63  _M_invoke_callbacks(copyfmt_event);
64  this->_M_set_exception_mask(__x.exceptions());
65  return *this;
66}
67
68template <class _CharT, class _Traits>
69locale basic_ios<_CharT, _Traits>::imbue(const locale& __loc) {
70  locale __tmp = ios_base::imbue(__loc);
71  _STLP_TRY {
72    if (_M_streambuf)
73      _M_streambuf->pubimbue(__loc);
74
75    // no throwing here
76    _M_cached_ctype = &use_facet<ctype<char_type> >(__loc);
77  }
78  _STLP_CATCH_ALL {
79    __tmp = ios_base::imbue(__tmp);
80    _M_handle_exception(ios_base::failbit);
81  }
82  return __tmp;
83}
84
85// Protected constructor and initialization functions. The default
86// constructor creates an uninitialized basic_ios, and init() initializes
87// all of the members to the values in Table 89 of the C++ standard.
88
89template <class _CharT, class _Traits>
90basic_ios<_CharT, _Traits>::basic_ios()
91  : ios_base(),
92    _M_fill(_STLP_NULL_CHAR_INIT(_CharT)), _M_streambuf(0), _M_tied_ostream(0)
93{}
94
95template <class _CharT, class _Traits>
96void
97basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
98{
99  this->rdbuf(__sb);
100  this->imbue(locale());
101  this->tie(0);
102  this->_M_set_exception_mask(ios_base::goodbit);
103  this->_M_clear_nothrow(__sb != 0 ? ios_base::goodbit : ios_base::badbit);
104  ios_base::flags(ios_base::skipws | ios_base::dec);
105  ios_base::width(0);
106  ios_base::precision(6);
107  this->fill(widen(' '));
108  // We don't need to worry about any of the three arrays: they are
109  // initialized correctly in ios_base's constructor.
110}
111
112// This is never called except from within a catch clause.
113template <class _CharT, class _Traits>
114void basic_ios<_CharT, _Traits>::_M_handle_exception(ios_base::iostate __flag)
115{
116  this->_M_setstate_nothrow(__flag);
117  if (this->_M_get_exception_mask() & __flag)
118    _STLP_RETHROW;
119}
120
121_STLP_END_NAMESPACE
122
123#endif /* _STLP_IOS_C */
124
125// Local Variables:
126// mode:C++
127// End:
128