@@ -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)
@@ -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>{
@@ -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);
@@ -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;
Many programs like gptfdisk or powertop try to use 64-bit integers with streams. This adds support for them. Signed-off-by: Rosen Penev <rosenp@gmail.com> --- include/istream | 21 ++++++++++++++++ include/istream_helpers | 55 +++++++++++++++++++++++++++++++++++++++++ include/ostream | 20 +++++++++++++++ tests/sstreamtest.cpp | 10 +++++++- 4 files changed, 105 insertions(+), 1 deletion(-)