From 17e15f7f3bac951cca622f52b0baac91aa2ba401 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 2 Dec 2003 18:30:42 +0000 Subject: [PATCH] locale_facets.tcc (time_get::do_get_year): Avoid using a basic_string and calling a full blown strtol (via __convert_to_v)... 2003-12-02 Paolo Carlini * include/bits/locale_facets.tcc (time_get::do_get_year): Avoid using a basic_string and calling a full blown strtol (via __convert_to_v) for simple 2 or 4 digits, base 10, positive integers; simplify. From-SVN: r74193 --- libstdc++-v3/ChangeLog | 7 +++++++ libstdc++-v3/include/bits/locale_facets.tcc | 22 +++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3e928ef598b..63eed9dbdaf 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2003-12-02 Paolo Carlini + + * include/bits/locale_facets.tcc (time_get::do_get_year): + Avoid using a basic_string and calling a full blown strtol + (via __convert_to_v) for simple 2 or 4 digits, base 10, + positive integers; simplify. + 2003-12-02 Paolo Carlini * config/locale/gnu/monetary_members.cc diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 147a9bc8fe1..47696ac7c76 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1964,21 +1964,17 @@ namespace std const ctype<_CharT>& __ctype = use_facet >(__loc); size_t __i = 0; - string __digits; - for (; __i < 4 && __beg != __end - && __ctype.is(ctype_base::digit, *__beg); ++__beg, ++__i) - __digits += __ctype.narrow(*__beg, 0); - if (__i == 2 || __i == 4) + int __value = 0; + for (; __beg != __end && __i < 4; ++__beg, ++__i) { - long __l; - std::__convert_to_v(__digits.c_str(), __l, __err, - _S_get_c_locale()); - if (!(__err & ios_base::failbit) && __l <= INT_MAX) - { - __l = __i == 2 ? __l : __l - 1900; - __tm->tm_year = static_cast(__l); - } + const char __c = __ctype.narrow(*__beg, '*'); + if (__c >= '0' && __c <= '9') + __value = __value * 10 + (__c - '0'); + else + break; } + if (__i == 2 || __i == 4) + __tm->tm_year = __i == 2 ? __value : __value - 1900; else __err |= ios_base::failbit; if (__beg == __end) -- 2.30.2