1
 
/*      Copyright (C) 2004 Garrett A. Kajmowicz
 
3
 
        This file is part of the uClibc++ Library.
 
5
 
        This library is free software; you can redistribute it and/or
 
6
 
        modify it under the terms of the GNU Lesser General Public
 
7
 
        License as published by the Free Software Foundation; either
 
8
 
        version 2.1 of the License, or (at your option) any later version.
 
10
 
        This library is distributed in the hope that it will be useful,
 
11
 
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
13
 
        Lesser General Public License for more details.
 
15
 
        You should have received a copy of the GNU Lesser General Public
 
16
 
        License along with this library; if not, write to the Free Software
 
17
 
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
20
 
#include <basic_definitions>
 
25
 
#ifndef __HEADER_STD_IOS
 
26
 
#define __HEADER_STD_IOS 1
 
28
 
#pragma GCC visibility push(default)
 
31
 
        typedef signed long int streamoff;
 
33
 
        template <class stateT> class fpos;
 
35
 
        class _UCXXEXPORT ios_base {
 
38
 
#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
 
39
 
                class failure : public exception {
 
41
 
                        explicit failure(const std::string& msg) { }
 
42
 
                        explicit failure() { }
 
43
 
                        virtual const char* what() const throw() {
 
44
 
                                return "std::ios_base failure exception";
 
48
 
#ifdef __UCLIBCXX_SUPPORT_CDIR__
 
49
 
                class _UCXXLOCAL Init{
 
60
 
                typedef unsigned short int fmtflags;
 
62
 
                static const fmtflags skipws            = 0x0001;
 
64
 
                static const fmtflags left              = 0x0002;
 
65
 
                static const fmtflags right             = 0x0004;
 
66
 
                static const fmtflags internal          = 0x0008;
 
68
 
                static const fmtflags boolalpha         = 0x0010;
 
70
 
                static const fmtflags dec               = 0x0020;
 
71
 
                static const fmtflags oct               = 0x0040;
 
72
 
                static const fmtflags hex               = 0x0080;
 
74
 
                static const fmtflags scientific        = 0x0100;
 
75
 
                static const fmtflags fixed             = 0x0200;
 
77
 
                static const fmtflags showbase          = 0x0400;
 
78
 
                static const fmtflags showpoint         = 0x0800;
 
79
 
                static const fmtflags showpos           = 0x1000;
 
80
 
                static const fmtflags uppercase         = 0x2000;
 
82
 
                static const fmtflags adjustfield       = left | right | internal;
 
83
 
                static const fmtflags basefield         = dec | oct | hex;
 
84
 
                static const fmtflags floatfield        = fixed | scientific;
 
86
 
                static const fmtflags unitbuf           = 0x4000;
 
88
 
                typedef unsigned char iostate;
 
89
 
                static const iostate goodbit            = 0x00;
 
90
 
                static const iostate badbit             = 0x01;
 
91
 
                static const iostate eofbit             = 0x02;
 
92
 
                static const iostate failbit            = 0x04;
 
94
 
                typedef unsigned char openmode;
 
95
 
                static const openmode app               = 0x01;
 
96
 
                static const openmode ate               = 0x02;
 
97
 
                static const openmode binary            = 0x04;
 
98
 
                static const openmode in                = 0x08;
 
99
 
                static const openmode out               = 0x10;
 
100
 
                static const openmode trunc             = 0x20;
 
102
 
                typedef unsigned char seekdir;
 
103
 
                static const seekdir beg                = 0x01;
 
104
 
                static const seekdir cur                = 0x02;
 
105
 
                static const seekdir end                = 0x04;
 
107
 
                _UCXXEXPORT fmtflags flags() const{
 
110
 
                _UCXXEXPORT fmtflags flags(fmtflags fmtfl);
 
112
 
                fmtflags setf(fmtflags fmtfl);
 
113
 
                fmtflags setf(fmtflags fmtfl, fmtflags mask );
 
115
 
                _UCXXEXPORT void unsetf(fmtflags mask){
 
119
 
                _UCXXEXPORT streamsize precision() const{
 
123
 
                _UCXXEXPORT streamsize precision(streamsize prec);
 
125
 
                _UCXXEXPORT streamsize width() const{
 
129
 
                _UCXXEXPORT streamsize width(streamsize wide);
 
131
 
                _UCXXEXPORT locale imbue(const locale& loc);
 
133
 
                _UCXXEXPORT locale getloc() const{
 
137
 
//              FIXME - These need to be implemented
 
138
 
//              static int xalloc();
 
139
 
//              long&  iword(int index);
 
140
 
//              void*& pword(int index);
 
142
 
                _UCXXEXPORT ~ios_base() { }
 
144
 
                enum event { erase_event, imbue_event, copyfmt_event };
 
146
 
                typedef void (*event_callback)(event, ios_base&, int index);
 
147
 
//              void register_callback(event_call_back fn, int index);
 
149
 
                //We are going to wrap stdio so we don't need implementation of the following:
 
150
 
                inline static bool sync_with_stdio(bool = true) { return true; }
 
153
 
                _UCXXEXPORT ios_base() : mLocale(), mformat(dec | skipws ), mstate(goodbit), 
 
154
 
                        mmode(), mdir(), mprecision(6), mwidth(0)
 
155
 
#ifdef __UCLIBCXX_SUPPORT_CDIR__
 
166
 
                streamsize mprecision;
 
168
 
#ifdef __UCLIBCXX_SUPPORT_CDIR__
 
174
 
        //ios_base manipulators
 
177
 
        inline ios_base& boolalpha  (ios_base& str){
 
178
 
                str.setf(ios_base::boolalpha);
 
181
 
        inline ios_base& noboolalpha(ios_base& str){
 
182
 
                str.unsetf(ios_base::boolalpha);
 
185
 
        inline ios_base& showbase   (ios_base& str){
 
186
 
                str.setf(ios_base::showbase);
 
189
 
        inline ios_base& noshowbase (ios_base& str){
 
190
 
                str.unsetf(ios_base::showbase);
 
193
 
        inline ios_base& showpoint  (ios_base& str){
 
194
 
                str.setf(ios_base::showpoint);
 
197
 
        inline ios_base& noshowpoint(ios_base& str){
 
198
 
                str.unsetf(ios_base::showpoint);
 
201
 
        inline ios_base& showpos    (ios_base& str){
 
202
 
                str.setf(ios_base::showpos);
 
205
 
        inline ios_base& noshowpos  (ios_base& str){
 
206
 
                str.unsetf(ios_base::showpos);
 
209
 
        inline ios_base& skipws     (ios_base& str){
 
210
 
                str.setf(ios_base::skipws);
 
213
 
        inline ios_base& noskipws   (ios_base& str){
 
214
 
                str.unsetf(ios_base::skipws);
 
217
 
        inline ios_base& uppercase  (ios_base& str){
 
218
 
                str.setf(ios_base::uppercase);
 
221
 
        inline ios_base& nouppercase(ios_base& str){
 
222
 
                str.unsetf(ios_base::uppercase);
 
226
 
        inline ios_base& unitbuf    (ios_base& str){
 
227
 
                str.setf(ios_base::unitbuf);
 
230
 
        inline ios_base& nounitbuf  (ios_base& str){
 
231
 
                str.unsetf(ios_base::unitbuf);
 
234
 
        inline ios_base& internal   (ios_base& str){
 
235
 
                str.setf(ios_base::internal, ios_base::adjustfield);
 
238
 
        inline ios_base& left       (ios_base& str){
 
239
 
                str.setf(ios_base::left, ios_base::adjustfield);
 
242
 
        inline ios_base& right      (ios_base& str){
 
243
 
                str.setf(ios_base::right, ios_base::adjustfield);
 
247
 
        inline ios_base& dec        (ios_base& str){
 
248
 
                str.setf(ios_base::dec, ios_base::basefield);
 
251
 
        inline ios_base& hex        (ios_base& str){
 
252
 
                str.setf(ios_base::hex, ios_base::basefield);
 
255
 
        inline ios_base& oct        (ios_base& str){
 
256
 
                str.setf(ios_base::oct, ios_base::basefield);
 
260
 
        inline ios_base& fixed      (ios_base& str){
 
261
 
                str.setf(ios_base::fixed, ios_base::floatfield);
 
264
 
        inline ios_base& scientific (ios_base& str){
 
265
 
                str.setf(ios_base::scientific, ios_base::floatfield);
 
270
 
        //basic_ios class definition
 
273
 
        template <class charT, class traits > class _UCXXEXPORT basic_ios
 
278
 
                typedef charT char_type;
 
279
 
                typedef typename traits::int_type int_type;
 
280
 
                typedef typename traits::pos_type pos_type;
 
281
 
                typedef typename traits::off_type off_type;
 
282
 
                typedef traits traits_type;
 
284
 
                _UCXXEXPORT operator void*() const{
 
288
 
                        return (void *)(1);     //Must return a non-NULL pointer (though it can be *any* pointer)
 
291
 
                _UCXXEXPORT bool operator!() const{
 
294
 
                _UCXXEXPORT iostate rdstate() const{
 
297
 
                _UCXXEXPORT void clear(iostate state = goodbit){
 
301
 
                                mstate = state|ios_base::badbit;
 
304
 
                _UCXXEXPORT void setstate(iostate state) {
 
305
 
                        clear(rdstate()  | state);
 
306
 
#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
 
307
 
                        if(rdstate() & throw_mask){
 
313
 
                _UCXXEXPORT bool good() const{
 
314
 
                        return (rdstate() == 0);
 
316
 
                _UCXXEXPORT bool eof()  const{
 
317
 
                        if(rdstate() & eofbit){
 
322
 
                _UCXXEXPORT bool fail() const{
 
323
 
                        if( mstate & (failbit | badbit) ){
 
329
 
                _UCXXEXPORT bool bad()  const{
 
336
 
                _UCXXEXPORT iostate exceptions() const{
 
339
 
                _UCXXEXPORT void exceptions(iostate except){
 
343
 
                explicit _UCXXEXPORT basic_ios(basic_streambuf<charT,traits>* sb) : fill_char(' '), mtied(0), mstreambuf(0){
 
347
 
                basic_ios() : mtied(0), mstreambuf(0){ }
 
349
 
                virtual _UCXXEXPORT ~basic_ios(){
 
352
 
                _UCXXEXPORT basic_ostream<charT,traits>* tie() const{
 
355
 
                _UCXXEXPORT basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr){
 
356
 
                        basic_ostream<charT,traits>* retval= mtied;
 
360
 
                _UCXXEXPORT basic_streambuf<charT,traits>* rdbuf() const{
 
363
 
                _UCXXEXPORT basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb){
 
364
 
                        basic_streambuf<charT,traits>* retval = mstreambuf;
 
368
 
                _UCXXEXPORT basic_ios& copyfmt(const basic_ios& rhs);
 
369
 
                _UCXXEXPORT char_type fill() const{
 
372
 
                _UCXXEXPORT char_type fill(char_type ch){
 
373
 
                        char_type temp = fill_char;
 
378
 
                _UCXXEXPORT locale imbue(const locale& loc){
 
379
 
                        return ios_base::imbue(loc);
 
381
 
                _UCXXEXPORT char narrow(char_type c, char dfault) const;
 
382
 
                _UCXXEXPORT char_type widen(char c) const;
 
386
 
                basic_ostream<charT,traits>* mtied;
 
387
 
                basic_streambuf<charT,traits>* mstreambuf;
 
389
 
                _UCXXEXPORT basic_ios(const basic_ios<charT,traits> &){ }
 
390
 
                _UCXXEXPORT basic_ios<charT,traits> & operator=(const basic_ios<charT,traits> &){ return *this; }
 
391
 
                _UCXXEXPORT void init(basic_streambuf<charT,traits>* sb){
 
392
 
                        ios_base::mformat = skipws|dec;
 
395
 
                        throw_mask = goodbit;
 
399
 
#ifdef __UCLIBCXX_EXPAND_IOS_CHAR__
 
400
 
#ifndef __UCLIBCXX_COMPILE_IOS__
 
402
 
        template <> _UCXXEXPORT void basic_ios<char, char_traits<char> >::clear(iostate state);
 
403
 
        template <> _UCXXEXPORT void basic_ios<char, char_traits<char> >::setstate(iostate state);
 
409
 
        template <class charT, class traits>
 
410
 
                inline char basic_ios<charT, traits>::narrow(char_type c, char dfault) const
 
416
 
                inline char basic_ios<char, char_traits<char> >::narrow(char_type c, char) const
 
421
 
#ifdef __UCLIBCXX_HAS_WCHAR__
 
424
 
                inline char basic_ios<wchar_t, char_traits<wchar_t> >::narrow(char_type c, char dfault) const
 
426
 
                char retval = wctob (c);
 
433
 
#endif  //__UCLIBCXX_HAS_WCHAR__
 
435
 
        template <class charT, class traits> 
 
436
 
                inline typename basic_ios<charT, traits>::char_type
 
437
 
                basic_ios<charT, traits>::widen(char c) const
 
443
 
                inline basic_ios<char, char_traits<char> >::char_type
 
444
 
                basic_ios<char, char_traits<char> >::widen(char c) const
 
449
 
#ifdef __UCLIBCXX_HAS_WCHAR__
 
452
 
                inline basic_ios<wchar_t, char_traits<wchar_t> >::char_type
 
453
 
                basic_ios<wchar_t, char_traits<wchar_t> >::widen(char c) const
 
458
 
#endif //__UCLIBCXX_HAS_WCHAR__
 
461
 
        template <class stateT> class _UCXXEXPORT fpos{
 
463
 
                _UCXXEXPORT fpos(stateT s){
 
466
 
                _UCXXEXPORT stateT state() const{
 
469
 
                _UCXXEXPORT void state(stateT s){
 
472
 
                _UCXXEXPORT bool operator==(const fpos &rhs){
 
475
 
                _UCXXEXPORT bool operator!=(const fpos &rhs){
 
478
 
                _UCXXEXPORT fpos & operator+(const streamoff & o){
 
482
 
                _UCXXEXPORT fpos & operator-(const streamoff & o){
 
486
 
                _UCXXEXPORT streamoff operator-(const fpos & rhs){
 
498
 
#pragma GCC visibility pop