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] |
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