nuttx/libs/libxx/0001-uclibxx-use-overload-constructor-of-filebuf-ostream.patch

300 lines
8.4 KiB
Diff
Raw Normal View History

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