| From b9028c8bc1a4cd00feb5328521bdde332fefeda3 Mon Sep 17 00:00:00 2001 |
| From: zhuyanlin <zhuyanlin1@xiaomi.com> |
| 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 charT, class traits> class _UCXXEXPORT basic_filebuf |
| : public basic_streambuf<charT,traits> |
| { |
| -#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<charT, traits>::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<charT, traits>(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<charT,traits>* sb, basic_ostream<charT,traits>* 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<charT, traits>::init(sb); |
| } |
| + explicit basic_istream(basic_streambuf<charT,traits>* sb, basic_ostream<charT,traits>* tied) |
| + : basic_ios<charT, traits>(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<charT,traits>::init(sb); |
| } |
| + |
| + _UCXXEXPORT basic_ostream(basic_streambuf<charT,traits>* sb, ios_base::fmtflags fmtfl) |
| + : basic_ios<charT, traits>(sb) |
| + { |
| + basic_ios<charT,traits>::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 charT, class traits> 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<char, char_traits<char> > & operator=(const basic_streambuf<char, char_traits<char> > &){ |
| 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 |
| |