This is the mail archive of the libstdc++@sourceware.cygnus.com mailing list for the libstdc++ project. See the libstdc++ home page for more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

num_get<>::do_get patch (fixed version)



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