xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/src/c++98/ios.cc (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // Iostreams base classes -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4*e4b17023SJohn Marino // 2006, 2007, 2008, 2009, 2010
5*e4b17023SJohn Marino // Free Software Foundation, Inc.
6*e4b17023SJohn Marino //
7*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
8*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
9*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
10*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
11*e4b17023SJohn Marino // any later version.
12*e4b17023SJohn Marino 
13*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
14*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
15*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*e4b17023SJohn Marino // GNU General Public License for more details.
17*e4b17023SJohn Marino 
18*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
19*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
20*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
21*e4b17023SJohn Marino 
22*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
23*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
24*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
26*e4b17023SJohn Marino 
27*e4b17023SJohn Marino //
28*e4b17023SJohn Marino // ISO C++ 14882: 27.4  Iostreams base classes
29*e4b17023SJohn Marino //
30*e4b17023SJohn Marino 
31*e4b17023SJohn Marino #include <ios>
32*e4b17023SJohn Marino #include <limits>
33*e4b17023SJohn Marino 
34*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
35*e4b17023SJohn Marino {
36*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION
37*e4b17023SJohn Marino 
38*e4b17023SJohn Marino   // Definitions for static const members of ios_base.
39*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::boolalpha;
40*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::dec;
41*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::fixed;
42*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::hex;
43*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::internal;
44*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::left;
45*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::oct;
46*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::right;
47*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::scientific;
48*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::showbase;
49*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::showpoint;
50*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::showpos;
51*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::skipws;
52*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::unitbuf;
53*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::uppercase;
54*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::adjustfield;
55*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::basefield;
56*e4b17023SJohn Marino   const ios_base::fmtflags ios_base::floatfield;
57*e4b17023SJohn Marino 
58*e4b17023SJohn Marino   const ios_base::iostate ios_base::badbit;
59*e4b17023SJohn Marino   const ios_base::iostate ios_base::eofbit;
60*e4b17023SJohn Marino   const ios_base::iostate ios_base::failbit;
61*e4b17023SJohn Marino   const ios_base::iostate ios_base::goodbit;
62*e4b17023SJohn Marino 
63*e4b17023SJohn Marino   const ios_base::openmode ios_base::app;
64*e4b17023SJohn Marino   const ios_base::openmode ios_base::ate;
65*e4b17023SJohn Marino   const ios_base::openmode ios_base::binary;
66*e4b17023SJohn Marino   const ios_base::openmode ios_base::in;
67*e4b17023SJohn Marino   const ios_base::openmode ios_base::out;
68*e4b17023SJohn Marino   const ios_base::openmode ios_base::trunc;
69*e4b17023SJohn Marino 
70*e4b17023SJohn Marino   const ios_base::seekdir ios_base::beg;
71*e4b17023SJohn Marino   const ios_base::seekdir ios_base::cur;
72*e4b17023SJohn Marino   const ios_base::seekdir ios_base::end;
73*e4b17023SJohn Marino 
74*e4b17023SJohn Marino   _Atomic_word ios_base::Init::_S_refcount;
75*e4b17023SJohn Marino 
76*e4b17023SJohn Marino   bool ios_base::Init::_S_synced_with_stdio = true;
77*e4b17023SJohn Marino 
ios_base()78*e4b17023SJohn Marino   ios_base::ios_base() throw()
79*e4b17023SJohn Marino   : _M_precision(), _M_width(), _M_flags(), _M_exception(),
80*e4b17023SJohn Marino   _M_streambuf_state(), _M_callbacks(0), _M_word_zero(),
81*e4b17023SJohn Marino   _M_word_size(_S_local_word_size), _M_word(_M_local_word), _M_ios_locale()
82*e4b17023SJohn Marino   {
83*e4b17023SJohn Marino     // Do nothing: basic_ios::init() does it.
84*e4b17023SJohn Marino     // NB: _M_callbacks and _M_word must be zero for non-initialized
85*e4b17023SJohn Marino     // ios_base to go through ~ios_base gracefully.
86*e4b17023SJohn Marino   }
87*e4b17023SJohn Marino 
88*e4b17023SJohn Marino   // 27.4.2.7  ios_base constructors/destructors
~ios_base()89*e4b17023SJohn Marino   ios_base::~ios_base()
90*e4b17023SJohn Marino   {
91*e4b17023SJohn Marino     _M_call_callbacks(erase_event);
92*e4b17023SJohn Marino     _M_dispose_callbacks();
93*e4b17023SJohn Marino     if (_M_word != _M_local_word)
94*e4b17023SJohn Marino       {
95*e4b17023SJohn Marino 	delete [] _M_word;
96*e4b17023SJohn Marino 	_M_word = 0;
97*e4b17023SJohn Marino       }
98*e4b17023SJohn Marino   }
99*e4b17023SJohn Marino 
100*e4b17023SJohn Marino   // 27.4.2.5  ios_base storage functions
101*e4b17023SJohn Marino   int
xalloc()102*e4b17023SJohn Marino   ios_base::xalloc() throw()
103*e4b17023SJohn Marino   {
104*e4b17023SJohn Marino     // Implementation note: Initialize top to zero to ensure that
105*e4b17023SJohn Marino     // initialization occurs before main() is started.
106*e4b17023SJohn Marino     static _Atomic_word _S_top = 0;
107*e4b17023SJohn Marino     return __gnu_cxx::__exchange_and_add_dispatch(&_S_top, 1) + 4;
108*e4b17023SJohn Marino   }
109*e4b17023SJohn Marino 
110*e4b17023SJohn Marino   void
register_callback(event_callback __fn,int __index)111*e4b17023SJohn Marino   ios_base::register_callback(event_callback __fn, int __index)
112*e4b17023SJohn Marino   { _M_callbacks = new _Callback_list(__fn, __index, _M_callbacks); }
113*e4b17023SJohn Marino 
114*e4b17023SJohn Marino   // 27.4.2.5  iword/pword storage
115*e4b17023SJohn Marino   ios_base::_Words&
_M_grow_words(int __ix,bool __iword)116*e4b17023SJohn Marino   ios_base::_M_grow_words(int __ix, bool __iword)
117*e4b17023SJohn Marino   {
118*e4b17023SJohn Marino     // Precondition: _M_word_size <= __ix
119*e4b17023SJohn Marino     int __newsize = _S_local_word_size;
120*e4b17023SJohn Marino     _Words* __words = _M_local_word;
121*e4b17023SJohn Marino     if (__ix > _S_local_word_size - 1)
122*e4b17023SJohn Marino       {
123*e4b17023SJohn Marino 	if (__ix < numeric_limits<int>::max())
124*e4b17023SJohn Marino 	  {
125*e4b17023SJohn Marino 	    __newsize = __ix + 1;
126*e4b17023SJohn Marino 	    __try
127*e4b17023SJohn Marino 	      { __words = new _Words[__newsize]; }
128*e4b17023SJohn Marino 	    __catch(const std::bad_alloc&)
129*e4b17023SJohn Marino 	      {
130*e4b17023SJohn Marino 		_M_streambuf_state |= badbit;
131*e4b17023SJohn Marino 		if (_M_streambuf_state & _M_exception)
132*e4b17023SJohn Marino 		  __throw_ios_failure(__N("ios_base::_M_grow_words "
133*e4b17023SJohn Marino 					  "allocation failed"));
134*e4b17023SJohn Marino 		if (__iword)
135*e4b17023SJohn Marino 		  _M_word_zero._M_iword = 0;
136*e4b17023SJohn Marino 		else
137*e4b17023SJohn Marino 		  _M_word_zero._M_pword = 0;
138*e4b17023SJohn Marino 		return _M_word_zero;
139*e4b17023SJohn Marino 	      }
140*e4b17023SJohn Marino 	    for (int __i = 0; __i < _M_word_size; __i++)
141*e4b17023SJohn Marino 	      __words[__i] = _M_word[__i];
142*e4b17023SJohn Marino 	    if (_M_word && _M_word != _M_local_word)
143*e4b17023SJohn Marino 	      {
144*e4b17023SJohn Marino 		delete [] _M_word;
145*e4b17023SJohn Marino 		_M_word = 0;
146*e4b17023SJohn Marino 	      }
147*e4b17023SJohn Marino 	  }
148*e4b17023SJohn Marino 	else
149*e4b17023SJohn Marino 	  {
150*e4b17023SJohn Marino 	    _M_streambuf_state |= badbit;
151*e4b17023SJohn Marino 	    if (_M_streambuf_state & _M_exception)
152*e4b17023SJohn Marino 	      __throw_ios_failure(__N("ios_base::_M_grow_words is not valid"));
153*e4b17023SJohn Marino 	    if (__iword)
154*e4b17023SJohn Marino 	      _M_word_zero._M_iword = 0;
155*e4b17023SJohn Marino 	    else
156*e4b17023SJohn Marino 	      _M_word_zero._M_pword = 0;
157*e4b17023SJohn Marino 	    return _M_word_zero;
158*e4b17023SJohn Marino 	  }
159*e4b17023SJohn Marino       }
160*e4b17023SJohn Marino     _M_word = __words;
161*e4b17023SJohn Marino     _M_word_size = __newsize;
162*e4b17023SJohn Marino     return _M_word[__ix];
163*e4b17023SJohn Marino   }
164*e4b17023SJohn Marino 
165*e4b17023SJohn Marino   void
_M_call_callbacks(event __e)166*e4b17023SJohn Marino   ios_base::_M_call_callbacks(event __e) throw()
167*e4b17023SJohn Marino   {
168*e4b17023SJohn Marino     _Callback_list* __p = _M_callbacks;
169*e4b17023SJohn Marino     while (__p)
170*e4b17023SJohn Marino       {
171*e4b17023SJohn Marino 	__try
172*e4b17023SJohn Marino 	  { (*__p->_M_fn) (__e, *this, __p->_M_index); }
173*e4b17023SJohn Marino 	__catch(...)
174*e4b17023SJohn Marino 	  { }
175*e4b17023SJohn Marino 	__p = __p->_M_next;
176*e4b17023SJohn Marino       }
177*e4b17023SJohn Marino   }
178*e4b17023SJohn Marino 
179*e4b17023SJohn Marino   void
_M_dispose_callbacks(void)180*e4b17023SJohn Marino   ios_base::_M_dispose_callbacks(void) throw()
181*e4b17023SJohn Marino   {
182*e4b17023SJohn Marino     _Callback_list* __p = _M_callbacks;
183*e4b17023SJohn Marino     while (__p && __p->_M_remove_reference() == 0)
184*e4b17023SJohn Marino       {
185*e4b17023SJohn Marino 	_Callback_list* __next = __p->_M_next;
186*e4b17023SJohn Marino 	delete __p;
187*e4b17023SJohn Marino 	__p = __next;
188*e4b17023SJohn Marino       }
189*e4b17023SJohn Marino     _M_callbacks = 0;
190*e4b17023SJohn Marino   }
191*e4b17023SJohn Marino 
192*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION
193*e4b17023SJohn Marino } // namespace
194