dde241f306
overload constructor of filebuf & ostream in uclibxx Signed-off-by: zhuyanlin <zhuyanlin1@xiaomi.com>
300 lines
8.4 KiB
Diff
300 lines
8.4 KiB
Diff
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
|
|
|