Many programs like gptfdisk or powertop try to use 64-bit integers with
streams. This adds support for them.

Signed-off-by: Rosen Penev <[email protected]>
---
 include/istream         | 21 ++++++++++++++++
 include/istream_helpers | 55 +++++++++++++++++++++++++++++++++++++++++
 include/ostream         | 20 +++++++++++++++
 tests/sstreamtest.cpp   | 10 +++++++-
 4 files changed, 105 insertions(+), 1 deletion(-)

diff --git a/include/istream b/include/istream
index 850ac30..afcaa5b 100644
--- a/include/istream
+++ b/include/istream
@@ -72,6 +72,11 @@ namespace std{
                basic_istream<charT,traits>& operator>>(void*& p);
                basic_istream<charT,traits>& 
operator>>(basic_streambuf<char_type,traits>* sb);
 
+#ifndef __STRICT_ANSI__
+               basic_istream<charT,traits>& operator>>(long long& n);
+               basic_istream<charT,traits>& operator>>(unsigned long long& n);
+#endif
+
 #ifdef __UCLIBCXX_HAS_FLOATS__
                basic_istream<charT,traits>& operator>>(float& f);
                basic_istream<charT,traits>& operator>>(double& f);
@@ -450,6 +455,22 @@ namespace std{
                return *this;
        }
 
+#ifndef __STRICT_ANSI__
+       template <class charT, class traits> _UCXXEXPORT 
basic_istream<charT,traits>&
+               basic_istream<charT,traits>::operator>>(long long& n)
+       {
+               sentry(*this);
+               __istream_readin<traits, charT, long long>::readin(*this, n);
+               return *this;
+       }
+       template <class charT, class traits> _UCXXEXPORT 
basic_istream<charT,traits>&
+               basic_istream<charT,traits>::operator>>(unsigned long long& n)
+       {
+               sentry(*this);
+               __istream_readin<traits, charT, unsigned long 
long>::readin(*this, n);
+               return *this;
+       }
+#endif
 #ifdef __UCLIBCXX_HAS_FLOATS__
        template <class charT, class traits> _UCXXEXPORT 
basic_istream<charT,traits>&
                basic_istream<charT,traits>::operator>>(float& n)
diff --git a/include/istream_helpers b/include/istream_helpers
index 588df7f..d87e0c7 100644
--- a/include/istream_helpers
+++ b/include/istream_helpers
@@ -301,6 +301,61 @@ namespace std{
        };
 
 
+#ifndef __STRICT_ANSI__
+       template <class traits> class _UCXXEXPORT __istream_readin<traits, 
char, long long>{
+       public:
+               inline static void readin(basic_istream<char, traits >& stream, 
long long & var)
+               {
+                       basic_string<char, traits > temp;
+
+                       if(stream.flags() & ios_base::dec){
+                               temp = _readTokenDecimal( stream);
+                               sscanf(temp.c_str(), "%lld", &var );
+                       }else{
+                               temp = _readToken( stream);
+                               if( stream.flags() & ios_base::oct){
+                                       sscanf(temp.c_str(), "%llo", (unsigned 
long long *)&var );
+                               }else if(stream.flags() & ios_base::hex){
+                                       if(stream.flags() & 
ios_base::uppercase){
+                                               scanf(temp.c_str(), "%llX", 
(unsigned long long *)&var );
+                                       }else{
+                                               sscanf(temp.c_str(), "%llx", 
(unsigned long long *)&var);
+                                       }
+                               }else{
+                                       sscanf(temp.c_str(), "%lli", (&var) );
+                               }
+                       }
+               }
+       };
+
+
+       template <class traits> class _UCXXEXPORT __istream_readin<traits, 
char, unsigned long long>{
+       public:
+               inline static void readin(basic_istream<char, traits >& stream, 
unsigned long long & var)
+               {
+                       basic_string<char, traits > temp;
+
+                       if(stream.flags() & ios_base::dec){
+                               temp = _readTokenDecimal( stream);
+                               sscanf(temp.c_str(), "%llu", &var );
+                       }else{
+                               temp = _readToken( stream);
+                               if( stream.flags() & ios_base::oct){
+                                       sscanf(temp.c_str(), "%llo", &var );
+                               }else if(stream.flags() & ios_base::hex){
+                                       if(stream.flags() & 
ios_base::uppercase){
+                                               scanf(temp.c_str(), "%llX", 
&var );
+                                       }else{
+                                               sscanf(temp.c_str(), "%llx", 
&var);
+                                       }
+                               }else{
+                                       sscanf(temp.c_str(), "%lli", (long long 
*)(&var) );
+                               }
+                       }
+               }
+       };
+#endif
+
 #ifdef __UCLIBCXX_HAS_FLOATS__
 
        template <class traits> class _UCXXEXPORT __istream_readin<traits, 
char, float>{
diff --git a/include/ostream b/include/ostream
index b112e94..289514c 100644
--- a/include/ostream
+++ b/include/ostream
@@ -85,6 +85,10 @@ namespace std {
                basic_ostream<charT,traits>& operator<<(long double f);
                basic_ostream<charT,traits>& operator<<(void* p);
                basic_ostream<charT,traits>& 
operator<<(basic_streambuf<char_type,traits>* sb);
+#ifndef __STRICT_ANSI__
+               basic_ostream<charT,traits>& operator<<(long long n);
+               basic_ostream<charT,traits>& operator<<(unsigned long long n);
+#endif
 
                _UCXXEXPORT basic_ostream<charT,traits>& put(char_type c){
                        
if(basic_ostream<charT,traits>::traits_type::eq_int_type(
@@ -217,6 +221,22 @@ namespace std {
                return *this;
        }
 
+#ifndef __STRICT_ANSI__
+       template <class charT, class traits> _UCXXEXPORT 
basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(long long 
n)
+       {
+               sentry s(*this);
+               __ostream_printout<traits, charT, long long >::printout(*this, 
n);
+               return *this;
+       }
+
+       template <class charT, class traits> _UCXXEXPORT 
basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(unsigned 
long long n)
+       {
+               sentry s(*this);
+               __ostream_printout<traits, charT, unsigned long long 
>::printout(*this, n);
+               return *this;
+       }
+#endif
+
        template <class charT, class traits> _UCXXEXPORT 
basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(float f){
                sentry s(*this);
                __ostream_printout<traits, charT, double >::printout(*this, f);
diff --git a/tests/sstreamtest.cpp b/tests/sstreamtest.cpp
index df3d521..7543ee3 100644
--- a/tests/sstreamtest.cpp
+++ b/tests/sstreamtest.cpp
@@ -9,6 +9,9 @@ int main(){
        int i;
        std::string s;
        char c;
+#ifndef __STRICT_ANSI__
+       long long ll;
+#endif
 
        a << "Starting testing ";
        a << 2 ;
@@ -28,9 +31,14 @@ int main(){
 
 
 
+#ifndef __STRICT_ANSI__
+       a.str("55 2.35 5 Test");
+       a >> ll >> f >> i >> s;
+       std::cout << "ll (should be 55): " << ll << std::endl;
+#else
        a.str("2.35 5 Test");
-
        a >> f >> i >> s;
+#endif
 
        std::cout << "f (should be 2.35): " << f << std::endl;
        std::cout << "i (should be 5): " << i << std::endl;
-- 
2.17.1

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to