diff options
author | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2000-06-01 02:55:30 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2000-06-01 02:55:30 +0000 |
commit | 64cdd351dda48323a0a04beda01757e8b2bcbb7f (patch) | |
tree | 387ae7d7d2202f952157e06d629ba8b9ba11ac91 | |
parent | b2c62b3c644502631fadb9818bf0e61be670ca0b (diff) | |
download | gcc-64cdd351dda48323a0a04beda01757e8b2bcbb7f.zip gcc-64cdd351dda48323a0a04beda01757e8b2bcbb7f.tar.gz gcc-64cdd351dda48323a0a04beda01757e8b2bcbb7f.tar.bz2 |
locale_facets.tcc (num_get<char>::_M_extract): Fix signage, exponent, and scientific formatting issues.
2000-05-31 Russell Davidson <russell@ehess.cnrs-mrs.fr>
* bits/locale_facets.tcc (num_get<char>::_M_extract): Fix signage,
exponent, and scientific formatting issues.
* testsuite/27_io/istream_extractor_arith.cc (test09): Add tests.
From-SVN: r34328
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/bits/locale_facets.tcc | 46 | ||||
-rwxr-xr-x | libstdc++-v3/mkcheck.in | 22 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/istream_extractor_arith.cc | 24 |
4 files changed, 77 insertions, 23 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a038c84..46061c4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2000-05-31 Russell Davidson <russell@ehess.cnrs-mrs.fr> + + * bits/locale_facets.tcc (num_get<char>::_M_extract): Fix signage, + exponent, scientific formatting issues. + * testsuite/27_io/istream_extractor_arith.cc (test09): Add tests. + 2000-05-31 Branko Cibej <branko.cibej@hermes.si> * bits/limits_generic.h (numeric_limits<wchar_t>): Use WCHAR_MIN @@ -13,6 +19,8 @@ * acinclude.m4 (GLIBCPP_ENABLE_LONG_LONG): Add strtoull checks... + * mkcheck.in (SH_FLAG): Add in -Wl,--rpath -Wl,$LIB_PATH. Tweaks. + 2000-05-31 Steven King <sxking@uswest.net> * shadow/time.h: fix typo diff --git a/libstdc++-v3/bits/locale_facets.tcc b/libstdc++-v3/bits/locale_facets.tcc index aa78632..21774d9 100644 --- a/libstdc++-v3/bits/locale_facets.tcc +++ b/libstdc++-v3/bits/locale_facets.tcc @@ -313,6 +313,9 @@ namespace std int __sep_pos = 0; int __pos = 0; bool __testdec = false; + bool __testEE = false; + bool __testsign = false; + bool __testEEsign = false; const char* __lits = __fmt->_S_literals; while (__valid && __beg != __end) @@ -322,17 +325,42 @@ namespace std const char* __p = strchr(__fmt->_S_literals, __c); // NB: strchr returns true for __c == 0x0 - if (__p && __c) - { - if ((__p >= &__lits[__cache_type::_S_digits + __base] - && __p < &__lits[__cache_type::_S_digits_end]) || - (__p >= &__lits[__cache_type::_S_udigits+__base] - && __p < &__lits[__cache_type::_S_udigits_end])) + if (__p && __c) + { + // Check for sign and accept if appropriate. + if ((__p == &__lits[__cache_type::_S_minus]) + || (__p == &__lits[__cache_type::_S_plus])) + { + if (__testEE) + { + if (__testEEsign) break; + __testEEsign = true; + } + else + { + if (__testsign) break; + __testsign = true; + } + } + // Check for exponential part and accept if appropriate. + else if ((__p == &__lits[__cache_type::_S_ee]) + || (__p == &__lits[__cache_type::_S_Ee])) { - if (!(__fp && (__p == &__lits[__cache_type::_S_ee] - || __p == &__lits[__cache_type::_S_Ee]))) - break; + if (!__fp || __testEE || !__testsign) break; + __testEE = true; } + // Check for appropriate digits. If found, too late for a sign + else if ((__p >= &__lits[__cache_type::_S_digits] + && __p < &__lits[__cache_type::_S_digits+__base]) + || (__p >= &__lits[__cache_type::_S_udigits] + && __p < &__lits[__cache_type::_S_udigits+__base])) + { + __testsign = true; + if (__testEE) __testEEsign = true; + } + // Nothing else will do + else break; + __xtrc[__pos] = __c; ++__pos; ++__sep_pos; diff --git a/libstdc++-v3/mkcheck.in b/libstdc++-v3/mkcheck.in index 69989a3..cb1e62a 100755 --- a/libstdc++-v3/mkcheck.in +++ b/libstdc++-v3/mkcheck.in @@ -1,7 +1,5 @@ #!/usr/bin/env bash -# 2000-05-17 bkoz - # Script to do automated testing and data collection # for various test files, so that we don't have to do this by hand on # every test file. It attempts to collect some diagnostic info about @@ -61,14 +59,10 @@ fi #LIB_PATH == where to find the build library binaries. if [ $WHICH != "1" ]; then - LIB_PATH="-L$BUILD_DIR/src/.libs" -# BSD seems to want this -# LIB_PATH="-L$BUILD_DIR/src/.libs -R$BUILD_DIR/src/.libs" + LIB_PATH="$BUILD_DIR/src/.libs" CXX="../../gcc/g++ -B../../gcc/" elif [ $WHICH -eq 1 ]; then - LIB_PATH="-L$PREFIX_DIR/lib" -# BSD seems to want this -# LIB_PATH="-L$PREFIX_DIR/lib -R$PREFIX_DIR/lib" + LIB_PATH="$PREFIX_DIR/lib" CXX="$PREFIX_DIR/bin/g++" fi @@ -77,10 +71,10 @@ fi #CXX_FLAG="-g -O2 -DDEBUG_ASSERT " CXX_FLAG="-g -DDEBUG_ASSERT " -# a specific flag to force the use of shared libraries, if any +# a specific flag(s) to force the use of shared libraries, if any SH_FLAG="" -# a specific flag to force the use of static libraries, if any +# a specific flag(s) to force the use of static libraries, if any ST_FLAG="-static" # Set up the testing directory, which should be in a directory called @@ -183,8 +177,8 @@ test_file() # eventually have to calculate time_t anyhow. Or 3) just grab two # time_t's (no more overhead than grabbing two date(1)'s). COMP_TIME_START=$($TEST_DIR/printnow) - $CXX $CXX_FLAG $S_FLAG $INC_PATH $LIB_PATH $FILENAME \ - -o $EXENAME 2>> $LOG_FILE + $CXX $CXX_FLAG $S_FLAG $INC_PATH -L$LIB_PATH -Wl,--rpath -Wl,$LIB_PATH \ + $FILENAME -o $EXENAME 2>> $LOG_FILE COMP_TIME_END=$($TEST_DIR/printnow) if [ $COMP_TIME_START -lt $COMP_TIME_END ]; then @@ -293,8 +287,8 @@ test_file() #fi else # the file did not compile. Write out compilation info to the log file. - echo "$CXX $CXX_FLAG $ST_FLAG $INC_PATH $LIB_PATH $CNAME -o $EXENAME" \ - 2>> $LOG_FILE + echo "$CXX $CXX_FLAG $S_FLAG $INC_PATH -L$LIB_PATH -Wl,--rpath -Wl,$LIB_PATH \ + $FILENAME -o $EXENAME" 2>> $LOG_FILE RESULT="-" TEXT="0" diff --git a/libstdc++-v3/testsuite/27_io/istream_extractor_arith.cc b/libstdc++-v3/testsuite/27_io/istream_extractor_arith.cc index f6250b1..df06170 100644 --- a/libstdc++-v3/testsuite/27_io/istream_extractor_arith.cc +++ b/libstdc++-v3/testsuite/27_io/istream_extractor_arith.cc @@ -355,6 +355,29 @@ void test08() #endif } + +bool test09() +{ + bool test = true; + + std::string st("2.456e3-+0.567e-2"); + std::stringbuf sb(st); + std::istream is(&sb); + double f1 = 0, f2 = 0; + char c; + (is>>std::ws) >> f1; + (is>>std::ws) >> c; + (is>>std::ws) >> f2; + test = f1 == 2456; + test &= f2 == 0.00567; + test &= c == '-'; +#ifdef DEBUG_ASSERT + assert(test); +#endif + + return test; +} + int main() { test01(); @@ -364,6 +387,7 @@ int main() test06(); test07(); test08(); + test09(); return 0; } |