This is the mail archive of the
libstdc++@sourceware.cygnus.com
mailing list for the libstdc++ project.
Re: num_get<>::do_get patch
- To: Benjamin Kosnik <bkoz@cygnus.com>
- Subject: Re: num_get<>::do_get patch
- From: Ryszard Kabatek <rysio@rumcajs.chemie.uni-halle.de>
- Date: Fri, 23 Apr 1999 11:52:35 +0200 (CEST)
- cc: libstdc++@sourceware.cygnus.com
- Reply-To: kabatek@chemie.uni-halle.de
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 'L' 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.
See attachment.
BTW. The implementation of num_get<> uses a lot of string objects.
A byte array (char buf[256] or so) would be enough for the numeric types.
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 11:56:41 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,386 ----
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 double || long long = 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
--- 388,401 ----
// = %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";
--- 415,421 ----
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
--- 439,445 ----
_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
--- 460,480 ----
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 double || long long = 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
--- 482,495 ----
// = %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
--- 510,530 ----
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 double || long long = 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
*** 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
--- 532,545 ----
// = %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
*** 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
--- 560,580 ----
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 double || long long = 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
--- 582,595 ----
// = %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";
--- 609,615 ----
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
--- 633,639 ----
_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
--- 653,673 ----
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 double || long long = 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
--- 675,688 ----
// = %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
--- 703,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;
! const char* __conv = 0;
!
! // Add a length modifier, if necessary for this mf. Choices are:
! // short || unsigned short = h
! // long || unsigned long = l
! // long double || long long = 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
*** 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
--- 725,738 ----
// = %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
*** 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";
--- 753,759 ----
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
--- 777,783 ----
_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";
--- 797,803 ----
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
--- 821,827 ----
_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
--- 841,861 ----
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 double || long long = 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
--- 863,876 ----
// = %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";
--- 890,896 ----
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
--- 914,920 ----
_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