1
 
/*      Copyright (C) 2004 Garrett A. Kajmowicz
 
3
 
        This file is part of the uClibc C++ Library.  This library is free
 
4
 
        software; you can redistribute it and/or modify it under the
 
5
 
        terms of the GNU General Public License as published by the
 
6
 
        Free Software Foundation; either version 2, or (at your option)
 
9
 
        This library is distributed in the hope that it will be useful,
 
10
 
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
 
        GNU General Public License for more details.
 
14
 
        You should have received a copy of the GNU General Public License along
 
15
 
        with this library; see the file COPYING.  If not, write to the Free
 
16
 
        Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 
23
 
#include <istream_helpers>
 
26
 
#ifndef __STD_HEADER_ISTREAM
 
27
 
#define __STD_HEADER_ISTREAM 1
 
29
 
#pragma GCC visibility push(default)
 
33
 
        typedef basic_istream<char> istream;
 
35
 
#ifdef __UCLIBCXX_HAS_WCHAR__
 
36
 
        typedef basic_istream<wchar_t> wistream;
 
39
 
        template <class charT, class traits> basic_istream<charT,traits>& ws(basic_istream<charT,traits>& is);
 
41
 
        template <class charT, class traits> class _UCXXEXPORT basic_istream :
 
42
 
                virtual public basic_ios<charT,traits>
 
46
 
                typedef charT                     char_type;
 
47
 
                typedef typename traits::int_type int_type;
 
48
 
                typedef typename traits::pos_type pos_type;
 
49
 
                typedef typename traits::off_type off_type;
 
50
 
                typedef basic_streambuf<charT,traits>  streambuf_type;
 
51
 
                typedef traits                    traits_type;
 
53
 
                explicit basic_istream(basic_streambuf<charT,traits>* sb)
 
54
 
                        : basic_ios<charT, traits>(sb), count_last_ufmt_input(0)
 
56
 
                        basic_ios<charT, traits>::init(sb);
 
58
 
                virtual ~basic_istream() { }
 
62
 
                basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& (*pf)(basic_istream<charT,traits>&));
 
63
 
                basic_istream<charT,traits>& operator>>(basic_ios<charT,traits>& (*pf)(basic_ios<charT,traits>&));
 
64
 
                basic_istream<charT,traits>& operator>>(ios_base& (*pf)(ios_base&));
 
65
 
                basic_istream<charT,traits>& operator>>(bool& n);
 
66
 
                basic_istream<charT,traits>& operator>>(short& n);
 
67
 
                basic_istream<charT,traits>& operator>>(unsigned short& n);
 
68
 
                basic_istream<charT,traits>& operator>>(int& n);
 
69
 
                basic_istream<charT,traits>& operator>>(unsigned int& n);
 
70
 
                basic_istream<charT,traits>& operator>>(long& n);
 
71
 
                basic_istream<charT,traits>& operator>>(unsigned long& n);
 
72
 
                basic_istream<charT,traits>& operator>>(void*& p);
 
73
 
                basic_istream<charT,traits>& operator>>(basic_streambuf<char_type,traits>* sb);
 
75
 
#ifdef __UCLIBCXX_HAS_FLOATS__
 
76
 
                basic_istream<charT,traits>& operator>>(float& f);
 
77
 
                basic_istream<charT,traits>& operator>>(double& f);
 
78
 
                basic_istream<charT,traits>& operator>>(long double& f);
 
81
 
                _UCXXEXPORT streamsize gcount() const{
 
82
 
                        return count_last_ufmt_input;
 
85
 
                _UCXXEXPORT int_type get();             //below
 
86
 
                _UCXXEXPORT basic_istream<charT,traits>& get(char_type& c);     //Below
 
88
 
                _UCXXEXPORT basic_istream<charT,traits>& get(char_type* s, streamsize n){
 
89
 
                        return get(s, n, basic_ios<charT,traits>::widen('\n'));
 
92
 
                _UCXXEXPORT basic_istream<charT,traits>& get(char_type* s, streamsize n, char_type delim){
 
97
 
                                c = basic_ios<charT, traits>::mstreambuf->sgetc();
 
98
 
                                basic_ios<charT, traits>::mstreambuf->sbumpc();
 
99
 
                                if(c == traits::eof() ){
 
101
 
                                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
103
 
                                                basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
109
 
                                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
111
 
                                        basic_ios<charT, traits>::mstreambuf->sputbackc(c);
 
116
 
                        s[i] = traits::eos();
 
117
 
                        count_last_ufmt_input = i;
 
121
 
                _UCXXEXPORT basic_istream<charT,traits>& get(basic_streambuf<char_type,traits>& sb){
 
122
 
                        return get(sb, basic_ios<charT,traits>::widen('\n'));
 
125
 
                _UCXXEXPORT basic_istream<charT,traits>& get(basic_streambuf<char_type,traits>& sb, char_type delim){
 
129
 
                        while(1){               //We will exit internally based upon error conditions
 
130
 
                                c = basic_ios<charT, traits>::mstreambuf->sgetc();
 
131
 
                                if(c == traits::eof()){
 
133
 
                                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
135
 
                                                basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
137
 
                                        count_last_ufmt_input = i;
 
142
 
                                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
144
 
                                        count_last_ufmt_input = i;
 
147
 
                                if(sb.sputc(c) != c){   //Error doing output
 
148
 
                                        count_last_ufmt_input = i;
 
152
 
                                basic_ios<charT, traits>::mstreambuf->sbumpc();
 
156
 
                _UCXXEXPORT basic_istream<charT,traits>& getline(char_type* s, streamsize n){
 
157
 
                        return getline(s, n, basic_ios<charT,traits>::widen('\n'));
 
160
 
                _UCXXEXPORT basic_istream<charT,traits>& getline(char_type* s, streamsize n, char_type delim){
 
165
 
                                c = basic_ios<charT, traits>::mstreambuf->sgetc();
 
166
 
                                if(c == traits::eof() ){
 
167
 
                                        if( basic_ios<charT,traits>::eof() ){
 
168
 
                                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
170
 
                                                basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
172
 
                                        count_last_ufmt_input = i;
 
173
 
                                        s[i] = traits::eos();
 
176
 
                                if(basic_ios<charT, traits>::mstreambuf->sbumpc()==traits::eof() ){
 
177
 
                                        basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
180
 
                                        count_last_ufmt_input = i+1;
 
181
 
                                        s[i] = traits::eos();
 
186
 
                        s[n-1] = traits::eos();
 
190
 
                _UCXXEXPORT basic_istream<charT,traits>& ignore (streamsize n = 1, int_type delim = traits::eof()){
 
195
 
                                c = basic_ios<charT, traits>::mstreambuf->sgetc();
 
196
 
                                if(c == traits::eof()){
 
197
 
                                        basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
200
 
                                basic_ios<charT, traits>::mstreambuf->sbumpc();
 
208
 
                _UCXXEXPORT int_type peek(){
 
209
 
                        if(basic_ios<charT,traits>::good() == false){
 
210
 
                                return traits::eof();
 
212
 
                                int_type c = basic_ios<charT, traits>::mstreambuf->sgetc();
 
213
 
                                if(c == traits::eof()){
 
214
 
                                        basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
216
 
                                return basic_ios<charT, traits>::mstreambuf->sgetc();
 
220
 
                _UCXXEXPORT basic_istream<charT,traits>& read (char_type* s, streamsize n){
 
225
 
                                c = basic_ios<charT, traits>::mstreambuf->sgetc();
 
227
 
                                if(c == traits::eof()){
 
228
 
                                        basic_ios<charT,traits>::setstate(ios_base::failbit);
 
229
 
                                        basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
230
 
                                        count_last_ufmt_input = i;
 
233
 
                                basic_ios<charT, traits>::mstreambuf->sbumpc();
 
236
 
                        count_last_ufmt_input = n;
 
240
 
                _UCXXEXPORT streamsize readsome(char_type* s, streamsize n){
 
242
 
                        if(!basic_ios<charT,traits>::good()){
 
243
 
                                count_last_ufmt_input = 0;
 
244
 
                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
248
 
                        if( basic_ios<charT, traits>::mstreambuf->in_avail()  ==  -1){
 
249
 
                                count_last_ufmt_input=0;
 
250
 
                                basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
254
 
                        if(n > basic_ios<charT, traits>::mstreambuf->in_avail() ){
 
255
 
                                n = basic_ios<charT, traits>::mstreambuf->in_avail();
 
262
 
                                c = basic_ios<charT, traits>::mstreambuf->sgetc();
 
263
 
                                basic_ios<charT, traits>::mstreambuf->sbumpc();
 
266
 
                        count_last_ufmt_input = n;
 
270
 
                _UCXXEXPORT basic_istream<charT,traits>& putback(char_type c){
 
272
 
                        if(!basic_ios<charT,traits>::good()){
 
273
 
                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
276
 
                        if(basic_ios<charT, traits>::mstreambuf == 0){
 
277
 
                                basic_ios<charT,traits>::setstate(ios_base::badbit);
 
280
 
                        if(basic_ios<charT, traits>::mstreambuf->sputbackc(c) == traits::eof()){
 
281
 
                                basic_ios<charT,traits>::setstate(ios_base::badbit);
 
287
 
                _UCXXEXPORT basic_istream<charT,traits>& unget(){
 
289
 
                        if(!basic_ios<charT,traits>::good()){
 
290
 
                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
293
 
                        if(basic_ios<charT, traits>::mstreambuf == 0){
 
294
 
                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
297
 
                        if(basic_ios<charT, traits>::mstreambuf->sungetc() == traits::eof()){
 
298
 
                                basic_ios<charT,traits>::setstate(ios_base::failbit);
 
303
 
                _UCXXEXPORT int sync(){
 
305
 
                        if(basic_ios<charT, traits>::mstreambuf == 0){
 
308
 
                        if(basic_ios<charT, traits>::mstreambuf->pubsync() == -1){
 
309
 
                                basic_ios<charT,traits>::setstate(ios_base::badbit);
 
310
 
                                return traits::eof();
 
315
 
                _UCXXEXPORT pos_type tellg(){
 
316
 
                        if(basic_ios<charT,traits>::fail() !=false){
 
319
 
                        return basic_ios<charT, traits>::mstreambuf->pubseekoff(0, ios_base::cur, ios_base::in);
 
322
 
                _UCXXEXPORT basic_istream<charT,traits>& seekg(pos_type pos){
 
323
 
                         if(basic_ios<charT,traits>::fail() !=true){
 
324
 
                                basic_ios<charT, traits>::mstreambuf->pubseekpos(pos);
 
329
 
                _UCXXEXPORT basic_istream<charT,traits>& seekg(off_type off, ios_base::seekdir dir){
 
330
 
                        if(basic_ios<charT,traits>::fail() !=true){
 
331
 
                                basic_ios<charT, traits>::mstreambuf->pubseekoff(off, dir);
 
337
 
                _UCXXEXPORT basic_istream(const basic_istream<charT,traits> &): basic_ios<charT, traits>() { }
 
338
 
                _UCXXEXPORT basic_istream<charT,traits> & operator=(const basic_istream<charT,traits> &){ return *this; }
 
339
 
                streamsize count_last_ufmt_input;
 
343
 
        template <class charT,class traits = char_traits<charT> > class _UCXXEXPORT basic_istream<charT,traits>::sentry {
 
346
 
                explicit _UCXXEXPORT sentry(basic_istream<charT,traits>& os, bool noskipws = false){
 
347
 
                        if(os.good() !=0){              //Prepare for output
 
350
 
                        //Flush any tied buffer
 
360
 
                _UCXXEXPORT ~sentry() { }
 
361
 
                _UCXXEXPORT operator bool() {
 
366
 
        //Template implementations of basic_istream functions which may be partially specialized
 
369
 
        template <class charT, class traits>
 
370
 
        _UCXXEXPORT typename basic_istream<charT,traits>::int_type basic_istream<charT,traits>::get(){
 
372
 
                int_type retval = basic_ios<charT, traits>::mstreambuf->sgetc();
 
373
 
                if(retval == traits::eof()){
 
374
 
                        count_last_ufmt_input = 0;
 
375
 
                        basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
377
 
                        count_last_ufmt_input = 1;
 
378
 
                        basic_ios<charT, traits>::mstreambuf->sbumpc();
 
383
 
        template <class charT, class traits>
 
384
 
        _UCXXEXPORT basic_istream<charT,traits>& basic_istream<charT,traits>::get(char_type& c){
 
386
 
                int_type retval = basic_ios<charT, traits>::mstreambuf->sgetc();
 
387
 
                if(retval == traits::eof()){
 
388
 
                        count_last_ufmt_input = 0;
 
389
 
                        basic_ios<charT,traits>::setstate(ios_base::eofbit);
 
390
 
                        basic_ios<charT,traits>::setstate(ios_base::failbit);
 
392
 
                        count_last_ufmt_input = 1;
 
393
 
                        c = traits::to_char_type(retval);
 
394
 
                        basic_ios<charT, traits>::mstreambuf->sbumpc();
 
400
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
401
 
                basic_istream<charT,traits>::operator>>(bool& n)
 
404
 
                __istream_readin<traits, charT, bool>::readin(*this, n);
 
408
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
409
 
                basic_istream<charT,traits>::operator>>(short& n)
 
412
 
                __istream_readin<traits, charT, short>::readin(*this, n);
 
416
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
417
 
                basic_istream<charT,traits>::operator>>(unsigned short& n)
 
420
 
                __istream_readin<traits, charT, unsigned short>::readin(*this, n);
 
424
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& basic_istream<charT,traits>::operator>>(int& n){
 
426
 
                __istream_readin<traits, charT, int>::readin(*this, n);
 
430
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& basic_istream<charT,traits>::operator>>(unsigned int& n){
 
432
 
                __istream_readin<traits, charT, unsigned int>::readin(*this, n);
 
436
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& basic_istream<charT,traits>::operator>>(long int& n){
 
438
 
                __istream_readin<traits, charT, long int>::readin(*this, n);
 
442
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
443
 
                basic_istream<charT,traits>::operator>>(unsigned long int& n)
 
446
 
                __istream_readin<traits, charT, unsigned long int>::readin(*this, n);
 
450
 
#ifdef __UCLIBCXX_HAS_FLOATS__
 
451
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
452
 
                basic_istream<charT,traits>::operator>>(float& n)
 
455
 
                __istream_readin<traits, charT, float>::readin(*this, n);
 
458
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
459
 
                basic_istream<charT,traits>::operator>>(double& n)
 
462
 
                __istream_readin<traits, charT, double>::readin(*this, n);
 
465
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
466
 
                basic_istream<charT,traits>::operator>>(long double& n)
 
469
 
                __istream_readin<traits, charT, long double>::readin(*this, n);
 
473
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
474
 
                basic_istream<charT,traits>::operator>>(void *& n)
 
477
 
                __istream_readin<traits, charT, void*>::readin(*this, n);
 
481
 
        template<class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
 
482
 
                operator>>(basic_istream<charT,traits>& is, charT& c)
 
484
 
                typename basic_istream<charT,traits>::sentry s(is);
 
489
 
        template<class traits> _UCXXEXPORT basic_istream<char,traits>&
 
490
 
                operator>>(basic_istream<char,traits>& is, unsigned char& c)
 
492
 
                typename basic_istream<char,traits>::sentry s(is);
 
498
 
        template<class traits> _UCXXEXPORT basic_istream<char,traits>&
 
499
 
                operator>>(basic_istream<char,traits>& is, signed char& c)
 
501
 
                typename basic_istream<char,traits>::sentry s(is);
 
506
 
        template<class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
 
507
 
                operator>>(basic_istream<charT,traits>& is, charT* c)
 
509
 
                typename basic_istream<charT,traits>::sentry s(is);
 
512
 
                        n = __STRING_MAX_UNITS;
 
518
 
        template<class traits> _UCXXEXPORT basic_istream<char,traits>&
 
519
 
                operator>>(basic_istream<char,traits>& is, unsigned char* c)
 
521
 
                typename basic_istream<char,traits>::sentry s(is);
 
524
 
                        n = __STRING_MAX_UNITS;
 
529
 
        template<class traits> _UCXXEXPORT basic_istream<char,traits>&
 
530
 
                operator>>(basic_istream<char,traits>& is, signed char* c)
 
532
 
                typename basic_istream<char,traits>::sentry s(is);
 
535
 
                        n = __STRING_MAX_UNITS;
 
541
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
542
 
                basic_istream<charT,traits>::operator>>(basic_istream<charT,traits>& (*pf)(basic_istream<charT,traits>&))
 
549
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& 
 
550
 
                basic_istream<charT,traits>::operator>>(basic_ios<charT,traits>& (*pf)(basic_ios<charT,traits>&))
 
557
 
        template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
 
558
 
                ws(basic_istream<charT,traits>& is)
 
565
 
#ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__
 
566
 
#ifndef __UCLIBCXX_COMPILE_ISTREAM__
 
569
 
        template <> _UCXXEXPORT istream & basic_istream<char, char_traits<char> >::get(char & c);
 
570
 
        template <> _UCXXEXPORT istream::int_type basic_istream<char, char_traits<char> >::get();
 
572
 
        template <> _UCXXEXPORT istream & istream::operator>>(bool &n);
 
573
 
        template <> _UCXXEXPORT istream & istream::operator>>(short &n);
 
574
 
        template <> _UCXXEXPORT istream & istream::operator>>(unsigned short &n);
 
575
 
        template <> _UCXXEXPORT istream & istream::operator>>(int &n);
 
576
 
        template <> _UCXXEXPORT istream & istream::operator>>(unsigned int &n);
 
577
 
        template <> _UCXXEXPORT istream & istream::operator>>(long unsigned &n);
 
578
 
        template <> _UCXXEXPORT istream & istream::operator>>(long int &n);
 
579
 
        template <> _UCXXEXPORT istream & istream::operator>>(void *& p);
 
581
 
#ifdef __UCLIBCXX_HAS_FLOATS__
 
582
 
        template <> _UCXXEXPORT istream & istream::operator>>(float &f);
 
583
 
        template <> _UCXXEXPORT istream & istream::operator>>(double &f);
 
584
 
        template <> _UCXXEXPORT istream & istream::operator>>(long double &f);
 
587
 
        template <> _UCXXEXPORT istream & operator>>(istream & is, char & c);
 
589
 
        template <> _UCXXEXPORT void __skipws(basic_istream<char,char_traits<char> >& is);
 
598
 
#pragma GCC visibility pop