locale_facets.tcc (time_get::do_get_year): Avoid using a basic_string and calling...
authorPaolo Carlini <pcarlini@suse.de>
Tue, 2 Dec 2003 18:30:42 +0000 (18:30 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 2 Dec 2003 18:30:42 +0000 (18:30 +0000)
2003-12-02  Paolo Carlini  <pcarlini@suse.de>

* 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
libstdc++-v3/include/bits/locale_facets.tcc

index 3e928ef598bdd21c37aca2c7b0eba35ea91127ea..63eed9dbdaff30839af7fb56f187715cca0b25ec 100644 (file)
@@ -1,3 +1,10 @@
+2003-12-02  Paolo Carlini  <pcarlini@suse.de>
+
+       * 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  <pcarlini@suse.de>
 
        * config/locale/gnu/monetary_members.cc
index 147a9bc8fe161a1ef09437707910f1f8d62c3dd9..47696ac7c76d04eecf02c1a996823213bab5ba05 100644 (file)
@@ -1964,21 +1964,17 @@ namespace std
       const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__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<int>(__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)