From b9028c8bc1a4cd00feb5328521bdde332fefeda3 Mon Sep 17 00:00:00 2001 From: zhuyanlin Date: Mon, 27 Sep 2021 21:47:41 +0800 Subject: [PATCH] uclibxx: use overload constructor of filebuf & ostream Instead of set valiable in Init, use overload constructor in filebuf & stream class Change-Id: I090432b5576eb568f92f3c147b39ad2efd8ba6b0 --- include/fstream | 15 +++++++-- include/ios | 21 +++--------- include/istream | 4 +++ include/ostream | 8 +++++ include/streambuf | 6 ++-- src/ios.cpp | 84 ++++++++--------------------------------------- 6 files changed, 44 insertions(+), 94 deletions(-) diff --git a/uClibc++/include/fstream uClibc++/include/fstream index fddfa35..99a016e 100644 --- a/uClibc++/include/fstream +++ uClibc++/include/fstream @@ -53,9 +53,6 @@ namespace std{ template class _UCXXEXPORT basic_filebuf : public basic_streambuf { -#ifdef __UCLIBCXX_SUPPORT_CDIR__ - friend ios_base::Init::Init(); //Needed for cout/cin stuff -#endif public: // Types (inherited from basic_streambuf: typedef typename basic_streambuf::char_type char_type; @@ -79,6 +76,18 @@ namespace std{ gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__); } + _UCXXEXPORT basic_filebuf(FILE *p, ios_base::openmode opdfor) + : basic_streambuf(opdfor), fp(p), pbuffer(0), + gbuffer(0), append(false) + { + pbuffer = new char_type[__UCLIBCXX_IOSTREAM_BUFSIZE__]; + gbuffer = new char_type[__UCLIBCXX_IOSTREAM_BUFSIZE__]; + + this->setp(pbuffer, pbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__); + //Position get buffer so that there is no data available + this->setg(gbuffer, gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__, + gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__); + } _UCXXEXPORT virtual ~basic_filebuf(){ sync(); diff --git a/uClibc++/include/ios uClibc++/include/ios index ac6566a..6d2dd68 100644 --- a/uClibc++/include/ios +++ uClibc++/include/ios @@ -45,15 +45,6 @@ namespace std{ } }; #endif -#ifdef __UCLIBCXX_SUPPORT_CDIR__ - class _UCXXLOCAL Init{ - public: - _UCXXEXPORT Init(); - _UCXXEXPORT ~Init(); - private: - static int init_cnt; - }; -#endif public: @@ -154,11 +145,7 @@ namespace std{ 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; @@ -167,9 +154,6 @@ namespace std{ seekdir mdir; streamsize mprecision; streamsize mwidth; -#ifdef __UCLIBCXX_SUPPORT_CDIR__ - Init mInit; -#endif }; @@ -346,7 +330,10 @@ namespace std{ : fill_char(' '), mtied(0), mstreambuf(0), throw_mask(0) { init(sb); } - + explicit _UCXXEXPORT basic_ios(basic_streambuf* sb, basic_ostream* tied) + : fill_char(' '), mtied(tied), mstreambuf(0), throw_mask(0) { + init(sb); + } basic_ios() : mtied(0), mstreambuf(0){ } virtual _UCXXEXPORT ~basic_ios(){ diff --git a/uClibc++/include/istream uClibc++/include/istream index 2d58abd..8fa9ad4 100644 --- a/uClibc++/include/istream +++ uClibc++/include/istream @@ -55,6 +55,10 @@ namespace std{ { basic_ios::init(sb); } + explicit basic_istream(basic_streambuf* sb, basic_ostream* tied) + : basic_ios(sb, tied), count_last_ufmt_input(0) + { + } virtual ~basic_istream() { } class sentry; diff --git a/uClibc++/include/ostream uClibc++/include/ostream index 3072589..086a297 100644 --- a/uClibc++/include/ostream +++ uClibc++/include/ostream @@ -58,6 +58,14 @@ namespace std { { basic_ios::init(sb); } + + _UCXXEXPORT basic_ostream(basic_streambuf* sb, ios_base::fmtflags fmtfl) + : basic_ios(sb) + { + basic_ios::init(sb); + ios_base::setf(fmtfl); + } + virtual _UCXXEXPORT ~basic_ostream(); class sentry; diff --git a/uClibc++/include/streambuf uClibc++/include/streambuf index 0daa388..5327296 100644 --- a/uClibc++/include/streambuf +++ uClibc++/include/streambuf @@ -33,9 +33,6 @@ namespace std{ template class _UCXXEXPORT basic_streambuf{ public: -#ifdef __UCLIBCXX_SUPPORT_CDIR__ - friend ios_base::Init::Init(); -#endif // Types: typedef charT char_type; typedef typename traits::int_type int_type; @@ -116,6 +113,9 @@ namespace std{ mgbeg(0), mgnext(0), mgend(0), mpbeg(0), mpnext(0), mpend(0), openedFor(0) { } + basic_streambuf(ios_base::openmode opdfor) + : openedFor(opdfor) + { } basic_streambuf > & operator=(const basic_streambuf > &){ return *this; } diff --git a/uClibc++/src/ios.cpp uClibc++/src/ios.cpp index 3b85d5b..e6a390f 100644 --- a/uClibc++/src/ios.cpp +++ uClibc++/src/ios.cpp @@ -29,32 +29,31 @@ namespace std{ #ifdef __UCLIBCXX_SUPPORT_CDIR__ - _UCXXLOCAL int ios_base::Init::init_cnt = 0; //Needed to ensure the static value is created //Create buffers first #ifdef __UCLIBCXX_SUPPORT_COUT__ - _UCXXEXPORT filebuf _cout_filebuf; + _UCXXEXPORT filebuf _cout_filebuf(stdout, ios_base::out); #endif #ifdef __UCLIBCXX_SUPPORT_CIN__ - _UCXXEXPORT filebuf _cin_filebuf; + _UCXXEXPORT filebuf _cin_filebuf(stdin, ios_base::in); #endif #ifdef __UCLIBCXX_SUPPORT_CERR__ - _UCXXEXPORT filebuf _cerr_filebuf; + _UCXXEXPORT filebuf _cerr_filebuf(stderr, ios_base::out); #endif #ifdef __UCLIBCXX_SUPPORT_CLOG__ - _UCXXEXPORT filebuf _clog_filebuf; + _UCXXEXPORT filebuf _clog_filebuf(stderr, ios_base::out); #endif #ifdef __UCLIBCXX_SUPPORT_WCOUT__ - _UCXXEXPORT wfilebuf _wcout_filebuf; + _UCXXEXPORT wfilebuf _wcout_filebuf(stdout, ios_base::out); #endif #ifdef __UCLIBCXX_SUPPORT_WCIN__ - _UCXXEXPORT wfilebuf _wcin_filebuf; + _UCXXEXPORT wfilebuf _wcin_filebuf(stdin, ios_base::in); #endif #ifdef __UCLIBCXX_SUPPORT_WCERR__ - _UCXXEXPORT wfilebuf _wcerr_filebuf; + _UCXXEXPORT wfilebuf _wcerr_filebuf(stderr, ios_base::out); #endif #ifdef __UCLIBCXX_SUPPORT_WCLOG__ - _UCXXEXPORT wfilebuf _wclog_filebuf; + _UCXXEXPORT wfilebuf _wclog_filebuf(stderr, ios_base::out); #endif //Then create streams @@ -62,10 +61,10 @@ namespace std{ _UCXXEXPORT ostream cout(&_cout_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_CIN__ - _UCXXEXPORT istream cin(&_cin_filebuf); + _UCXXEXPORT istream cin(&_cin_filebuf, &cout); #endif #ifdef __UCLIBCXX_SUPPORT_CERR__ - _UCXXEXPORT ostream cerr(&_cerr_filebuf); + _UCXXEXPORT ostream cerr(&_cerr_filebuf, ios_base::unitbuf); #endif #ifdef __UCLIBCXX_SUPPORT_CLOG__ _UCXXEXPORT ostream clog(&_clog_filebuf); @@ -74,72 +73,15 @@ namespace std{ _UCXXEXPORT wostream wcout(&_wcout_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_WCIN__ - _UCXXEXPORT wistream wcin(&_wcin_filebuf); + _UCXXEXPORT wistream wcin(&_wcin_filebuf, &wcout); #endif #ifdef __UCLIBCXX_SUPPORT_WCERR__ - _UCXXEXPORT wostream wcerr(&_wcerr_filebuf); + _UCXXEXPORT wostream wcerr(&_wcerr_filebuf, ios_base::unitbuf); #endif #ifdef __UCLIBCXX_SUPPORT_WCLOG__ _UCXXEXPORT wostream wclog(&_wclog_filebuf); #endif - - _UCXXEXPORT ios_base::Init::Init(){ - if(init_cnt == 0){ //Need to construct cout et al -#ifdef __UCLIBCXX_SUPPORT_COUT__ - _cout_filebuf.fp = stdout; - _cout_filebuf.openedFor = ios_base::out; -#endif -#ifdef __UCLIBCXX_SUPPORT_CERR__ - _cerr_filebuf.fp = stderr; - _cerr_filebuf.openedFor = ios_base::out; - cerr.mformat |= ios_base::unitbuf; -#endif -#ifdef __UCLIBCXX_SUPPORT_CLOG__ - _clog_filebuf.fp = stderr; - _clog_filebuf.openedFor = ios_base::out; -#endif -#ifdef __UCLIBCXX_SUPPORT_CIN__ - _cin_filebuf.fp = stdin; - _cin_filebuf.openedFor = ios_base::in; - -#ifdef __UCLIBCXX_SUPPORT_COUT__ - cin.tie(&cout); -#endif - -#endif -#ifdef __UCLIBCXX_SUPPORT_WCOUT__ - _wcout_filebuf.fp = stdout; - _wcout_filebuf.openedFor = ios_base::out; -#endif -#ifdef __UCLIBCXX_SUPPORT_WCERR__ - _wcerr_filebuf.fp = stderr; - _wcerr_filebuf.openedFor = ios_base::out; - wcerr.mformat |= ios_base::unitbuf; -#endif -#ifdef __UCLIBCXX_SUPPORT_WCLOG__ - _wclog_filebuf.fp = stderr; - _wclog_filebuf.openedFor = ios_base::out; -#endif -#ifdef __UCLIBCXX_SUPPORT_WCIN__ - _wcin_filebuf.fp = stdin; - _wcin_filebuf.openedFor = ios_base::in; - -#ifdef __UCLIBCXX_SUPPORT_WCOUT__ - wcin.tie(&wcout); -#endif - -#endif - } - init_cnt++; - } - - _UCXXEXPORT ios_base::Init::~Init(){ - --init_cnt; - if(init_cnt==0){ - - } - } #endif -- 2.25.1