OSDN Git Service

2003-12-02 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Dec 2003 18:30:42 +0000 (18:30 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Dec 2003 18:30:42 +0000 (18:30 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74193 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/locale_facets.tcc

index 3e928ef..63eed9d 100644 (file)
@@ -1,5 +1,12 @@
 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
        (money_base::_S_construct_pattern): For case 3: and 4:
        exchanging 'if (__precedes)' and 'if (__space)' allows
index 147a9bc..47696ac 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)