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