/* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #ifndef __HEADER_STD_IOS #define __HEADER_STD_IOS 1 #pragma GCC visibility push(default) namespace std{ typedef signed long int streamoff; template class fpos; class _UCXXEXPORT ios_base { public: class failure; #ifdef __UCLIBCXX_EXCEPTION_SUPPORT__ class failure : public exception { public: explicit failure(const std::string& msg) { } explicit failure() { } virtual const char* what() const throw() { return "std::ios_base failure exception"; } }; #endif #ifdef __UCLIBCXX_SUPPORT_CDIR__ class _UCXXLOCAL Init{ public: _UCXXEXPORT Init(); _UCXXEXPORT ~Init(); private: static int init_cnt; }; #endif public: typedef unsigned short int fmtflags; static const fmtflags skipws = 0x0001; static const fmtflags left = 0x0002; static const fmtflags right = 0x0004; static const fmtflags internal = 0x0008; static const fmtflags boolalpha = 0x0010; static const fmtflags dec = 0x0020; static const fmtflags oct = 0x0040; static const fmtflags hex = 0x0080; static const fmtflags scientific = 0x0100; static const fmtflags fixed = 0x0200; static const fmtflags showbase = 0x0400; static const fmtflags showpoint = 0x0800; static const fmtflags showpos = 0x1000; static const fmtflags uppercase = 0x2000; static const fmtflags adjustfield = left | right | internal; static const fmtflags basefield = dec | oct | hex; static const fmtflags floatfield = fixed | scientific; static const fmtflags unitbuf = 0x4000; typedef unsigned char iostate; static const iostate goodbit = 0x00; static const iostate badbit = 0x01; static const iostate eofbit = 0x02; static const iostate failbit = 0x04; typedef unsigned char openmode; static const openmode app = 0x01; static const openmode ate = 0x02; static const openmode binary = 0x04; static const openmode in = 0x08; static const openmode out = 0x10; static const openmode trunc = 0x20; typedef unsigned char seekdir; static const seekdir beg = 0x01; static const seekdir cur = 0x02; static const seekdir end = 0x04; _UCXXEXPORT fmtflags flags() const{ return mformat; } _UCXXEXPORT fmtflags flags(fmtflags fmtfl) { fmtflags temp = mformat; mformat = fmtfl; return temp; } fmtflags setf(fmtflags fmtfl) { return flags(flags() | fmtfl); } fmtflags setf(fmtflags fmtfl, fmtflags mask ) { return flags( (flags()& ~mask) | (fmtfl & mask)); } _UCXXEXPORT void unsetf(fmtflags mask){ mformat&= ~mask; } _UCXXEXPORT streamsize precision() const{ return mprecision; } _UCXXEXPORT streamsize precision(streamsize prec) { streamsize temp = mprecision; mprecision = prec; return temp; } _UCXXEXPORT streamsize width() const{ return mwidth; } _UCXXEXPORT streamsize width(streamsize wide) { streamsize temp = mwidth; mwidth = wide; return temp; } _UCXXEXPORT locale imbue(const locale& loc) { locale retval = mLocale; mLocale = loc; return retval; } _UCXXEXPORT locale getloc() const{ return mLocale; } // FIXME - These need to be implemented // static int xalloc(); // long& iword(int index); // void*& pword(int index); _UCXXEXPORT ~ios_base() { } enum event { erase_event, imbue_event, copyfmt_event }; typedef void (*event_callback)(event, ios_base&, int index); // void register_callback(event_call_back fn, int index); //We are going to wrap stdio so we don't need implementation of the following: inline static bool sync_with_stdio(bool = true) { return true; } protected: _UCXXEXPORT ios_base() : mLocale(), mformat(dec | skipws ), mstate(goodbit), mmode(), mdir(), mprecision(6), mwidth(0) #ifdef __UCLIBCXX_SUPPORT_CDIR__ ,mInit() #endif { } locale mLocale; fmtflags mformat; iostate mstate; openmode mmode; seekdir mdir; streamsize mprecision; streamsize mwidth; #ifdef __UCLIBCXX_SUPPORT_CDIR__ Init mInit; #endif }; //ios_base manipulators inline ios_base& boolalpha (ios_base& str){ str.setf(ios_base::boolalpha); return str; } inline ios_base& noboolalpha(ios_base& str){ str.unsetf(ios_base::boolalpha); return str; } inline ios_base& showbase (ios_base& str){ str.setf(ios_base::showbase); return str; } inline ios_base& noshowbase (ios_base& str){ str.unsetf(ios_base::showbase); return str; } inline ios_base& showpoint (ios_base& str){ str.setf(ios_base::showpoint); return str; } inline ios_base& noshowpoint(ios_base& str){ str.unsetf(ios_base::showpoint); return str; } inline ios_base& showpos (ios_base& str){ str.setf(ios_base::showpos); return str; } inline ios_base& noshowpos (ios_base& str){ str.unsetf(ios_base::showpos); return str; } inline ios_base& skipws (ios_base& str){ str.setf(ios_base::skipws); return str; } inline ios_base& noskipws (ios_base& str){ str.unsetf(ios_base::skipws); return str; } inline ios_base& uppercase (ios_base& str){ str.setf(ios_base::uppercase); return str; } inline ios_base& nouppercase(ios_base& str){ str.unsetf(ios_base::uppercase); return str; } inline ios_base& unitbuf (ios_base& str){ str.setf(ios_base::unitbuf); return str; } inline ios_base& nounitbuf (ios_base& str){ str.unsetf(ios_base::unitbuf); return str; } inline ios_base& internal (ios_base& str){ str.setf(ios_base::internal, ios_base::adjustfield); return str; } inline ios_base& left (ios_base& str){ str.setf(ios_base::left, ios_base::adjustfield); return str; } inline ios_base& right (ios_base& str){ str.setf(ios_base::right, ios_base::adjustfield); return str; } inline ios_base& dec (ios_base& str){ str.setf(ios_base::dec, ios_base::basefield); return str; } inline ios_base& hex (ios_base& str){ str.setf(ios_base::hex, ios_base::basefield); return str; } inline ios_base& oct (ios_base& str){ str.setf(ios_base::oct, ios_base::basefield); return str; } inline ios_base& fixed (ios_base& str){ str.setf(ios_base::fixed, ios_base::floatfield); return str; } inline ios_base& scientific (ios_base& str){ str.setf(ios_base::scientific, ios_base::floatfield); return str; } //basic_ios class definition template class _UCXXEXPORT basic_ios : public ios_base { public: // Types: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; typedef traits traits_type; _UCXXEXPORT operator void*() const{ if(fail() ){ return 0; } return (void *)(1); //Must return a non-NULL pointer (though it can be *any* pointer) } _UCXXEXPORT bool operator!() const{ return fail(); } _UCXXEXPORT iostate rdstate() const{ return mstate; } _UCXXEXPORT void clear(iostate state = goodbit){ if(rdbuf()!=0){ mstate = state; }else{ mstate = state|ios_base::badbit; } } _UCXXEXPORT void setstate(iostate state) { clear(rdstate() | state); #ifdef __UCLIBCXX_EXCEPTION_SUPPORT__ if(rdstate() & throw_mask){ throw failure(); } #endif } _UCXXEXPORT bool good() const{ return (rdstate() == 0); } _UCXXEXPORT bool eof() const{ if(rdstate() & eofbit){ return true; } return false; } _UCXXEXPORT bool fail() const{ if( mstate & (failbit | badbit) ){ return true; } return false; } _UCXXEXPORT bool bad() const{ if(mstate & badbit){ return true; } return false; } _UCXXEXPORT iostate exceptions() const{ return throw_mask; } _UCXXEXPORT void exceptions(iostate except){ throw_mask = except; } explicit _UCXXEXPORT basic_ios(basic_streambuf* sb) : fill_char(' '), mtied(0), mstreambuf(0){ init(sb); } basic_ios() : mtied(0), mstreambuf(0){ } virtual _UCXXEXPORT ~basic_ios(){ } _UCXXEXPORT basic_ostream* tie() const{ return mtied; } _UCXXEXPORT basic_ostream* tie(basic_ostream* tiestr){ basic_ostream* retval= mtied; mtied = tiestr; return retval; } _UCXXEXPORT basic_streambuf* rdbuf() const{ return mstreambuf; } _UCXXEXPORT basic_streambuf* rdbuf(basic_streambuf* sb){ basic_streambuf* retval = mstreambuf; mstreambuf = sb; return retval; } _UCXXEXPORT basic_ios& copyfmt(const basic_ios& rhs); _UCXXEXPORT char_type fill() const{ return fill_char; } _UCXXEXPORT char_type fill(char_type ch){ char_type temp = fill_char; fill_char = ch; return temp; } _UCXXEXPORT locale imbue(const locale& loc){ return ios_base::imbue(loc); } _UCXXEXPORT char narrow(char_type c, char dfault) const; _UCXXEXPORT char_type widen(char c) const; protected: char_type fill_char; basic_ostream* mtied; basic_streambuf* mstreambuf; iostate throw_mask; _UCXXEXPORT basic_ios(const basic_ios &){ } _UCXXEXPORT basic_ios & operator=(const basic_ios &){ return *this; } _UCXXEXPORT void init(basic_streambuf* sb){ ios_base::mformat = skipws|dec; mstreambuf = sb; mstate = goodbit; throw_mask = goodbit; } }; #ifdef __UCLIBCXX_EXPAND_IOS_CHAR__ #ifndef __UCLIBCXX_COMPILE_IOS__ template <> _UCXXEXPORT void basic_ios >::clear(iostate state); template <> _UCXXEXPORT void basic_ios >::setstate(iostate state); #endif #endif template inline char basic_ios::narrow(char_type c, char dfault) const { return dfault; } template <> inline char basic_ios >::narrow(char_type c, char) const { return c; } #ifdef __UCLIBCXX_HAS_WCHAR__ template <> inline char basic_ios >::narrow(char_type c, char dfault) const { char retval = wctob (c); if(retval == EOF){ retval = dfault; } return retval; } #endif //__UCLIBCXX_HAS_WCHAR__ template inline typename basic_ios::char_type basic_ios::widen(char c) const { return c; } template <> inline basic_ios >::char_type basic_ios >::widen(char c) const { return c; } #ifdef __UCLIBCXX_HAS_WCHAR__ template <> inline basic_ios >::char_type basic_ios >::widen(char c) const { return btowc(c); } #endif //__UCLIBCXX_HAS_WCHAR__ template class _UCXXEXPORT fpos{ public: _UCXXEXPORT fpos(stateT s){ st = s; } _UCXXEXPORT stateT state() const{ return st; } _UCXXEXPORT void state(stateT s){ st = s; } _UCXXEXPORT bool operator==(const fpos &rhs){ return st == rhs.st; } _UCXXEXPORT bool operator!=(const fpos &rhs){ return st == rhs.st; } _UCXXEXPORT fpos & operator+(const streamoff & o){ st += o; return *this; } _UCXXEXPORT fpos & operator-(const streamoff & o){ st -= o; return *this; } _UCXXEXPORT streamoff operator-(const fpos & rhs){ return st - rhs.st; } private: stateT st; }; } #pragma GCC visibility pop #endif