diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f5b6c792af1..264136df7e4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2003-10-29 Paolo Carlini + + * include/bits/locale_facets.tcc (time_put::put): Absolutely + avoid dereferencing end iterators; clean up. + + * include/bits/locale_facets.tcc (num_get::_M_extract_float, + num_get::_M_extract_int): Minor tweak. + 2003-10-29 Paolo Carlini * include/bits/locale_facets.tcc: Remove some unnecessary diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 6e1760dd75f..681a4c3870e 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -219,10 +219,9 @@ namespace std { // Scientific notation. __xtrc += __e ? _S_atoms_in[_S_ie] : _S_atoms_in[_S_iE]; - ++__beg; // Remove optional plus or minus sign, if they exist. - if (__beg != __end) + if (++__beg != __end) { const bool __plus = __traits_type::eq(*__beg, __lit[_S_iplus]); if (__plus || __traits_type::eq(*__beg, __lit[_S_iminus])) @@ -327,9 +326,8 @@ namespace std if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero])) { __xtrc += _S_atoms_in[_S_izero]; - ++__beg; - if (__beg != __end) + if (++__beg != __end) { const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]); if (__x || __traits_type::eq(*__beg, __lit[_S_iX])) @@ -1995,31 +1993,32 @@ namespace std { const locale __loc = __io.getloc(); ctype<_CharT> const& __ctype = use_facet >(__loc); - while (__beg != __end) + for (; __beg != __end; ++__beg) { - const _CharT __tmp = *__beg; - ++__beg; - if (__ctype.narrow(__tmp, 0) == '%' && __beg != __end) + if (__ctype.narrow(*__beg, 0) != '%') + { + *__s = *__beg; + ++__s; + } + else if (++__beg != __end) { char __format; char __mod = 0; const char __c = __ctype.narrow(*__beg, 0); - ++__beg; - if (__c == 'E' || __c == 'O') + if (__c != 'E' && __c != 'O') + __format = __c; + else if (++__beg != __end) { __mod = __c; __format = __ctype.narrow(*__beg, 0); - ++__beg; } else - __format = __c; - __s = this->do_put(__s, __io, __fill, __tm, __format, __mod); + break; + __s = this->do_put(__s, __io, __fill, __tm, + __format, __mod); } else - { - *__s = __tmp; - ++__s; - } + break; } return __s; }