This is the mail archive of the
libstdc++@sourceware.cygnus.com
mailing list for the libstdc++ project.
num_get<>::do_get patch (fixed version)
- To: Benjamin Kosnik <bkoz@cygnus.com>
- Subject: num_get<>::do_get patch (fixed version)
- From: Ryszard Kabatek <rysio@rumcajs.chemie.uni-halle.de>
- Date: Fri, 23 Apr 1999 14:56:24 +0200 (CEST)
- cc: libstdc++@sourceware.cygnus.com
- Reply-To: kabatek@chemie.uni-halle.de
Ooops! I just looked into the C9X draft. The format parameter
of sscanf for long long is 'll' not 'L'. Both are supported
by glibc, but 'll' is portable.
Now the complete (fixed) patch again. See attachment.
1999-04-23 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
* bits/locfacets.tcc (num_get<>::do_get):
Fix the sscanf format parameter
for long long 'll' (as in C9X) instead of 'l'.
Fix the order of sscanf format parameters: "%dl" --> "%ld".
Change the type of the local variable '__conv' from 'string'
to 'const char*' and adapt the change.
BTW. The implementation of num_get<> uses a lot of string objects.
A byte array (char buf[256] or so) would be enough for any numeric type.
Ryszard Kabatek
Martin-Luther University Halle-Wittenberg, Department of Physical Chemistry
Geusaer Str. 88, 06217 Merseburg, Germany
Tel. +49 3461 46 2487 Fax. +49 3461 46 2129
*** lib3-cvs/libstdc++/bits/locfacets.tcc Thu Apr 22 10:43:44 1999
--- locfacets1.tcc Fri Apr 23 15:31:19 1999
*************** namespace std
*** 366,381 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
! __conv = "%o";
else if (__basefield == ios_base::hex)
! __conv = "%X";
else if (__basefield == 0)
! __conv = "%i";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
--- 366,387 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long long || unsigned long long = ll
! // long double = L
if (__basefield == ios_base::oct)
! __conv = "%ho";
else if (__basefield == ios_base::hex)
! __conv = "%hX";
else if (__basefield == 0)
! __conv = "%hi";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
*************** namespace std
*** 383,402 ****
// = %g for floats
// = %p for void*
else
! __conv = "%d";
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long double = L
! __conv += 'h';
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 389,402 ----
// = %g for floats
// = %p for void*
else
! __conv = "%hd";
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 416,422 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
__conv = "%o";
--- 416,422 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
if (__basefield == ios_base::oct)
__conv = "%o";
*************** namespace std
*** 440,446 ****
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 440,446 ----
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 461,476 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
! __conv = "%o";
else if (__basefield == ios_base::hex)
! __conv = "%X";
else if (__basefield == 0)
! __conv = "%i";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
--- 461,482 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long long || unsigned long long = ll
! // long double = L
if (__basefield == ios_base::oct)
! __conv = "%lo";
else if (__basefield == ios_base::hex)
! __conv = "%lX";
else if (__basefield == 0)
! __conv = "%li";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
*************** namespace std
*** 478,497 ****
// = %g for floats
// = %p for void*
else
! __conv = "%d";
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long double = L
! __conv += 'l';
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 484,497 ----
// = %g for floats
// = %p for void*
else
! __conv = "%ld";
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 512,527 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
! __conv = "%o";
else if (__basefield == ios_base::hex)
! __conv = "%X";
else if (__basefield == 0)
! __conv = "%i";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
--- 512,533 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long long || unsigned long long = ll
! // long double = L
if (__basefield == ios_base::oct)
! __conv = "%llo";
else if (__basefield == ios_base::hex)
! __conv = "%llX";
else if (__basefield == 0)
! __conv = "%lli";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
*************** namespace std
*** 529,548 ****
// = %g for floats
// = %p for void*
else
! __conv = "%d";
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long double = L
! __conv += 'l'; // XXX ?
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 535,548 ----
// = %g for floats
// = %p for void*
else
! __conv = "%lld";
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 563,578 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
! __conv = "%o";
else if (__basefield == ios_base::hex)
! __conv = "%X";
else if (__basefield == 0)
! __conv = "%i";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
--- 563,584 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long long || unsigned long long = ll
! // long double = L
if (__basefield == ios_base::oct)
! __conv = "%ho";
else if (__basefield == ios_base::hex)
! __conv = "%hX";
else if (__basefield == 0)
! __conv = "%hi";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
*************** namespace std
*** 580,599 ****
// = %g for floats
// = %p for void*
else
! __conv = "%u";
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long double = L
! __conv += 'h';
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 586,599 ----
// = %g for floats
// = %p for void*
else
! __conv = "%hu";
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 613,619 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
__conv = "%o";
--- 613,619 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
if (__basefield == ios_base::oct)
__conv = "%o";
*************** namespace std
*** 637,643 ****
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 637,643 ----
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 657,672 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
! __conv = "%o";
else if (__basefield == ios_base::hex)
! __conv = "%X";
else if (__basefield == 0)
! __conv = "%i";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
--- 657,678 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long long || unsigned long long = ll
! // long double = L
if (__basefield == ios_base::oct)
! __conv = "%lo";
else if (__basefield == ios_base::hex)
! __conv = "%lX";
else if (__basefield == 0)
! __conv = "%li";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
*************** namespace std
*** 674,693 ****
// = %g for floats
// = %p for void*
else
! __conv = "%u";
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long double = L
! __conv += 'l';
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 680,693 ----
// = %g for floats
// = %p for void*
else
! __conv = "%lu";
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 708,723 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
! __conv = "%o";
else if (__basefield == ios_base::hex)
! __conv = "%X";
else if (__basefield == 0)
! __conv = "%i";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
--- 708,729 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long long || unsigned long long = ll
! // long double = L
if (__basefield == ios_base::oct)
! __conv = "%llo";
else if (__basefield == ios_base::hex)
! __conv = "%llX";
else if (__basefield == 0)
! __conv = "%lli";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
*************** namespace std
*** 725,744 ****
// = %g for floats
// = %p for void*
else
! __conv = "%u";
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long double = L
! __conv += 'l'; // XXX ?
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 731,744 ----
// = %g for floats
// = %p for void*
else
! __conv = "%llu";
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 759,765 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
__conv = "%o";
--- 759,765 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
if (__basefield == ios_base::oct)
__conv = "%o";
*************** namespace std
*** 783,789 ****
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 783,789 ----
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 803,809 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
__conv = "%o";
--- 803,809 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
if (__basefield == ios_base::oct)
__conv = "%o";
*************** namespace std
*** 827,833 ****
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 827,833 ----
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 847,862 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
! __conv = "%o";
else if (__basefield == ios_base::hex)
! __conv = "%X";
else if (__basefield == 0)
! __conv = "%i";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
--- 847,868 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long long || unsigned long long = ll
! // long double = L
if (__basefield == ios_base::oct)
! __conv = "%Lo";
else if (__basefield == ios_base::hex)
! __conv = "%LX";
else if (__basefield == 0)
! __conv = "%Li";
// Add this in for each overloaded mf. Choices are:
// = %d for signed ints
*************** namespace std
*** 864,883 ****
// = %g for floats
// = %p for void*
else
! __conv = "%g";
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long double = L
! __conv += 'L';
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 870,883 ----
// = %g for floats
// = %p for void*
else
! __conv = "%Lg";
// Stage 2: extract
string __xtrc;
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
*************** namespace std
*** 897,903 ****
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! string __conv;
if (__basefield == ios_base::oct)
__conv = "%o";
--- 897,903 ----
ios_base::fmtflags __basefield = __flags & ios_base::basefield;
ios_base::fmtflags __uppercase = __flags & ios_base::uppercase;
ios_base::fmtflags __boolalpha = __flags & ios_base::boolalpha;
! const char* __conv = 0;
if (__basefield == ios_base::oct)
__conv = "%o";
*************** namespace std
*** 921,927 ****
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv.c_str(), &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else
--- 921,927 ----
_M_extract(__beg, __end, __io, __err, __xtrc);
// Stage 3: store results.
! int __ok = sscanf(__xtrc.c_str(), __conv, &__v);
if (__ok && __ok != __traits_type::eof())
__err = ios_base::goodbit;
else