c_locale.cc (__convert_to_v(long&), [...]): Remove.
authorPaolo Carlini <pcarlini@suse.de>
Mon, 8 Dec 2003 15:37:03 +0000 (15:37 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 8 Dec 2003 15:37:03 +0000 (15:37 +0000)
2003-12-08  Paolo Carlini  <pcarlini@suse.de>

* config/locale/generic/c_locale.cc (__convert_to_v(long&),
__convert_to_v(unsigned long&), __convert_to_v(long long&),
__convert_to_v(unsigned long long&): Remove.
(__convert_to_v(float&), __convert_to_v(double&),
__convert_to_v(long double&)): Remove last unused parameter.
* config/locale/gnu/c_locale.cc: Likewise.
* include/bits/locale_facets.h: Likewise.
(num_get::_M_extract_int): Update declaration.
(class __num_base): Tweak _S_ie and _S_iE according to the
_S_atoms_in changes.
* include/bits/locale_facets.tcc (num_get::_M_extract_int):
Provide directly the final _ValueT, not a string: accumulate
the result checking for overflow at each digit.
(num_get::do_get(bool&), num_get::do_get(long&),
num_get::do_get(unsigned short&), num_get::do_get(unsigned int&),
num_get::do_get(unsigned long&), num_get::do_get(long long&),
num_get::do_get(unsigned long long&), num_get::do_get(void*&)):
Use the new _M_extract_int, simplify.
* src/locale-inst.cc (num_get::_M_extract_int(long&),
num_get::_M_extract_int(unsigned short&),
num_get::_M_extract_int(unsigned int&),
num_get::_M_extract_int(unsigned long&),
num_get::_M_extract_int(long long&),
num_get::_M_extract_int(unsigned long long&): Instantiate.
* src/locale_facets.cc (__num_base::_S_atoms_in): Reorder
        the chars in the natural order: abcdefABCDEF.

From-SVN: r74423

libstdc++-v3/ChangeLog
libstdc++-v3/config/locale/generic/c_locale.cc
libstdc++-v3/config/locale/gnu/c_locale.cc
libstdc++-v3/include/bits/locale_facets.h
libstdc++-v3/include/bits/locale_facets.tcc
libstdc++-v3/src/locale-inst.cc
libstdc++-v3/src/locale_facets.cc

index 8d2c9ac2b794c29185c879e420a2da6952838078..62124ecde9af2d2f1b98e9cb80af67589e8e502e 100644 (file)
@@ -1,3 +1,32 @@
+2003-12-08  Paolo Carlini  <pcarlini@suse.de>
+
+       * config/locale/generic/c_locale.cc (__convert_to_v(long&),
+       __convert_to_v(unsigned long&), __convert_to_v(long long&),
+       __convert_to_v(unsigned long long&): Remove.
+       (__convert_to_v(float&), __convert_to_v(double&),
+       __convert_to_v(long double&)): Remove last unused parameter.
+       * config/locale/gnu/c_locale.cc: Likewise.
+       * include/bits/locale_facets.h: Likewise.
+       (num_get::_M_extract_int): Update declaration.
+       (class __num_base): Tweak _S_ie and _S_iE according to the
+       _S_atoms_in changes.
+       * include/bits/locale_facets.tcc (num_get::_M_extract_int):
+       Provide directly the final _ValueT, not a string: accumulate
+       the result checking for overflow at each digit.
+       (num_get::do_get(bool&), num_get::do_get(long&),
+       num_get::do_get(unsigned short&), num_get::do_get(unsigned int&),
+       num_get::do_get(unsigned long&), num_get::do_get(long long&),
+       num_get::do_get(unsigned long long&), num_get::do_get(void*&)):
+       Use the new _M_extract_int, simplify.
+       * src/locale-inst.cc (num_get::_M_extract_int(long&),
+       num_get::_M_extract_int(unsigned short&),
+       num_get::_M_extract_int(unsigned int&),
+       num_get::_M_extract_int(unsigned long&),
+       num_get::_M_extract_int(long long&),
+       num_get::_M_extract_int(unsigned long long&): Instantiate.
+       * src/locale_facets.cc (__num_base::_S_atoms_in): Reorder
+        the chars in the natural order: abcdefABCDEF.
+
 2003-12-08  David S. Miller  <davem@redhat.com>
 
        PR libstdc++/12496
index d0f81b8b4e3f2bf8d21e26975cef99cc125c5375..92b01c289bcda0b185d1dbf94beaacddaf913146 100644 (file)
 namespace std 
 {
   // Specializations for all types used in num_get.
-  template<>
-    void
-    __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, 
-                  const __c_locale&, int __base)
-    {
-      if (!(__err & ios_base::failbit))
-      {
-       char* __sanity;
-       errno = 0;
-       long __l = strtol(__s, &__sanity, __base);
-       if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
-         __v = __l;
-       else
-         __err |= ios_base::failbit;
-      }
-    }
-
-  template<>
-    void
-    __convert_to_v(const char* __s, unsigned long& __v, 
-                  ios_base::iostate& __err, const __c_locale&, int __base)
-    {
-      if (!(__err & ios_base::failbit))
-       {
-         char* __sanity;
-         errno = 0;
-         unsigned long __ul = strtoul(__s, &__sanity, __base);
-          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
-           __v = __ul;
-         else
-           __err |= ios_base::failbit;
-       }
-    }
-
-#ifdef _GLIBCXX_USE_LONG_LONG
-  template<>
-    void
-    __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, 
-                  const __c_locale&, int __base)
-    {
-      if (!(__err & ios_base::failbit))
-       {
-         char* __sanity;
-         errno = 0;
-         long long __ll = strtoll(__s, &__sanity, __base);
-          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
-           __v = __ll;
-         else
-           __err |= ios_base::failbit;
-       }
-    }
-
-  template<>
-    void
-    __convert_to_v(const char* __s, unsigned long long& __v, 
-                  ios_base::iostate& __err, const __c_locale&, int __base)
-    {
-      if (!(__err & ios_base::failbit))
-       {      
-         char* __sanity;
-         errno = 0;
-         unsigned long long __ull = strtoull(__s, &__sanity, __base);
-          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
-           __v = __ull;
-         else
-           __err |= ios_base::failbit;
-       }  
-    }
-#endif
-
   template<>
     void
     __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
-                  const __c_locale&, int)            
+                  const __c_locale&)         
     {
       if (!(__err & ios_base::failbit))
        {
@@ -158,7 +88,7 @@ namespace std
   template<>
     void
     __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
-                  const __c_locale&, int
+                  const __c_locale&) 
     {
       if (!(__err & ios_base::failbit))
        {
@@ -180,7 +110,7 @@ namespace std
   template<>
     void
     __convert_to_v(const char* __s, long double& __v, 
-                  ios_base::iostate& __err, const __c_locale&, int
+                  ios_base::iostate& __err, const __c_locale&) 
     {
       if (!(__err & ios_base::failbit))
        {
index 39daa895a0fdb98862cfc3fcb4f1da13c2762a7b..2dc6d73daf59d3d14691a5570979069edd1baa81 100644 (file)
 
 namespace std 
 {
-  template<>
-    void
-    __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, 
-                  const __c_locale& __cloc, int __base)
-    {
-      if (!(__err & ios_base::failbit))
-      {
-       char* __sanity;
-       errno = 0;
-       long __l = __strtol_l(__s, &__sanity, __base, __cloc);
-       if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
-         __v = __l;
-       else
-         __err |= ios_base::failbit;
-      }
-    }
-
-  template<>
-    void
-    __convert_to_v(const char* __s, unsigned long& __v, 
-                  ios_base::iostate& __err, const __c_locale& __cloc, 
-                  int __base)
-    {
-      if (!(__err & ios_base::failbit))
-       {
-         char* __sanity;
-         errno = 0;
-         unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc);
-          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
-           __v = __ul;
-         else
-           __err |= ios_base::failbit;
-       }
-    }
-
-#ifdef _GLIBCXX_USE_LONG_LONG
-  template<>
-    void
-    __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, 
-                  const __c_locale& __cloc, int __base)
-    {
-      if (!(__err & ios_base::failbit))
-       {
-         char* __sanity;
-         errno = 0;
-         long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc);
-          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
-           __v = __ll;
-         else
-           __err |= ios_base::failbit;
-       }
-    }
-
-  template<>
-    void
-    __convert_to_v(const char* __s, unsigned long long& __v, 
-                  ios_base::iostate& __err, const __c_locale& __cloc, 
-                  int __base)
-    {
-      if (!(__err & ios_base::failbit))
-       {      
-         char* __sanity;
-         errno = 0;
-         unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, 
-                                                 __cloc);
-          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
-           __v = __ull;
-         else
-           __err |= ios_base::failbit;
-       }  
-    }
-#endif
-
   template<>
     void
     __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
-                  const __c_locale& __cloc, int)
+                  const __c_locale& __cloc)
     {
       if (!(__err & ios_base::failbit))
        {
@@ -134,7 +61,7 @@ namespace std
   template<>
     void
     __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
-                  const __c_locale& __cloc, int)
+                  const __c_locale& __cloc)
     {
       if (!(__err & ios_base::failbit))
        {
@@ -151,7 +78,7 @@ namespace std
   template<>
     void
     __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
-                  const __c_locale& __cloc, int)
+                  const __c_locale& __cloc)
     {
       if (!(__err & ios_base::failbit))
        {
index a29538ac228c130d9e8c591a00753b1a3f50d8ce..a61ac9f4b9bc95c19a6c3d54ea66f4e9fc6b5c8f 100644 (file)
@@ -63,45 +63,23 @@ namespace std
   template<typename _Tv>
     void
     __convert_to_v(const char* __in, _Tv& __out, ios_base::iostate& __err, 
-                  const __c_locale& __cloc, int __base = 10);
+                  const __c_locale& __cloc);
 
   // Explicit specializations for required types.
-  template<>
-    void
-    __convert_to_v(const char*, long&, ios_base::iostate&, 
-                  const __c_locale&, int);
-
-  template<>
-    void
-    __convert_to_v(const char*, unsigned long&, ios_base::iostate&, 
-                  const __c_locale&, int);
-
-#ifdef _GLIBCXX_USE_LONG_LONG
-  template<>
-    void
-    __convert_to_v(const char*, long long&, ios_base::iostate&, 
-                  const __c_locale&, int);
-
-  template<>
-    void
-    __convert_to_v(const char*, unsigned long long&, ios_base::iostate&, 
-                  const __c_locale&, int);
-#endif
-
   template<>
     void
     __convert_to_v(const char*, float&, ios_base::iostate&, 
-                  const __c_locale&, int);
+                  const __c_locale&);
 
   template<>
     void
     __convert_to_v(const char*, double&, ios_base::iostate&, 
-                  const __c_locale&, int);
+                  const __c_locale&);
 
- template<>
 template<>
     void
     __convert_to_v(const char*, long double&, ios_base::iostate&, 
-                  const __c_locale&, int);
+                  const __c_locale&);
 
   // NB: __pad is a struct, rather than a function, so it can be
   // partially-specialized.
@@ -586,7 +564,7 @@ namespace std
     static const char* _S_atoms_out;
 
     // String literal of acceptable (narrow) input, for num_get.
-    // "-+xX0123456789eEabcdfABCDF"
+    // "-+xX0123456789abcdefABCDEF"
     static const char* _S_atoms_in;
 
     enum 
@@ -596,8 +574,8 @@ namespace std
       _S_ix, 
       _S_iX, 
       _S_izero,
-      _S_ie = _S_izero + 10,
-      _S_iE = _S_izero + 11,
+      _S_ie = _S_izero + 14,
+      _S_iE = _S_izero + 20,
       _S_iend = 26
     };
 
@@ -624,7 +602,7 @@ namespace std
       _CharT                           _M_atoms_out[__num_base::_S_oend + 1];
 
       // A list of valid numeric literals for input: in the standard
-      // "C" locale, this is "-+xX0123456789eEabcdfABCDF"
+      // "C" locale, this is "-+xX0123456789abcdefABCDEF"
       // This array contains the chars after having been passed
       // through the current locale's ctype<_CharT>.widen().
       _CharT                           _M_atoms_in[__num_base::_S_iend + 1];
@@ -893,9 +871,10 @@ namespace std
       _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&, 
                       string& __xtrc) const;
 
-      iter_type 
-      _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&, 
-                    string& __xtrc, int& __base) const;
+      template<typename _ValueT>
+        iter_type 
+        _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&, 
+                      _ValueT& __v) const;
 
       virtual iter_type 
       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
index e921585fe9cb10d834045d49fc41b78f9044d0a7..efd7fd378d99a781164ec86f3968f0d04452b375 100644 (file)
@@ -258,144 +258,194 @@ namespace std
     }
 
   template<typename _CharT, typename _InIter>
-    _InIter
-    num_get<_CharT, _InIter>::
-    _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
-                  ios_base::iostate& __err, string& __xtrc, int& __base) const
-    {
-      typedef char_traits<_CharT>                      __traits_type;
-      typedef typename numpunct<_CharT>::__cache_type          __cache_type;
-      __use_cache<__cache_type> __uc;
-      const locale& __loc = __io._M_getloc();
-      const __cache_type* __lc = __uc(__loc);
-      const _CharT* __lit = __lc->_M_atoms_in;
-      // NB: Iff __basefield == 0, this can change based on contents.
-      const ios_base::fmtflags __basefield = __io.flags() & ios_base::basefield;
-      if (__basefield == ios_base::oct)
-        __base = 8;
-      else if (__basefield == ios_base::hex)
-        __base = 16;
-      else
-       __base = 10;
+    template<typename _ValueT> 
+      _InIter
+      num_get<_CharT, _InIter>::
+      _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
+                    ios_base::iostate& __err, _ValueT& __v) const
+      {
+        typedef char_traits<_CharT>                    __traits_type;
+       typedef typename numpunct<_CharT>::__cache_type __cache_type; 
+       __use_cache<__cache_type> __uc;
+       const locale& __loc = __io._M_getloc();
+       const __cache_type* __lc = __uc(__loc);
+       const _CharT* __lit = __lc->_M_atoms_in;
 
-      // First check for sign.
-      if (__beg != __end)
-       {
-         const char_type __c = *__beg;
-         const bool __plus = __traits_type::eq(__c, __lit[_S_iplus]);
-         if (__plus || __traits_type::eq(__c, __lit[_S_iminus]))
-           {
-             __xtrc += __plus ? _S_atoms_in[_S_iplus]
-                              : _S_atoms_in[_S_iminus];
-             ++__beg;
-           }
-       }
+       // NB: Iff __basefield == 0, __base can change based on contents.
+       const ios_base::fmtflags __basefield = __io.flags() & ios_base::basefield;
+       const bool __oct = __basefield == ios_base::oct;
+       int __base = __oct ? 8 : (__basefield == ios_base::hex ? 16 : 10);
 
-      // Next, look for leading zeros and check required digits for base formats.
-      if (__builtin_expect(__base == 10, true))
-       {
-         // Look for a zero...
-         if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
-           {
-             __xtrc += _S_atoms_in[_S_izero];
+       // True if numeric digits are found.
+       bool __found_num = false;
+
+       // First check for sign.
+       bool __negative = false;
+       if (__beg != __end)
+         {
+           __negative = __traits_type::eq(*__beg, __lit[_S_iminus]);
+           if (__negative && numeric_limits<_ValueT>::is_signed
+               || __traits_type::eq(*__beg, __lit[_S_iplus]))
              ++__beg;
-             // ... and skip the additional ones.
-             for (; __beg != __end
-                    && __traits_type::eq(*__beg, __lit[_S_izero]); ++__beg);
-             
-             // Check required digits.
-             if (__beg != __end && __basefield == 0)
-               {         
-                 const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
-                 if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
-                   {
-                     __xtrc += __x ? _S_atoms_in[_S_ix] 
-                                   : _S_atoms_in[_S_iX];
-                     __base = 16;
-                     ++__beg;                
-                   }
-                 else 
-                   __base = 8;
-               }             
-           }
-       }
-      else if (__base == 16)
-       {
-         if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
-           {
-             __xtrc += _S_atoms_in[_S_izero];
-             
-             if (++__beg != __end)
-               {
-                 const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
-                 if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
-                   {
-                     __xtrc += __x ? _S_atoms_in[_S_ix] 
-                                   : _S_atoms_in[_S_iX];
-                     ++__beg;
-                   }
-               }
-           }
-       }
+         }
 
-      // At this point, base is determined. If not hex, only allow
-      // base digits as valid input.
-      const size_t __len = __base == 16 ? _S_iend : __base;
+       // Next, look for leading zeros and check required digits
+       // for base formats.
+       if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
+         {
+           __found_num = true;
+           ++__beg;
+           if (__builtin_expect(__base == 10, true))
+             {
+               // Skip the additional zeros.
+               for (; __beg != __end
+                      && __traits_type::eq(*__beg, __lit[_S_izero]); ++__beg);
+               
+               // Check required digits.
+               if (__beg != __end && __basefield == 0)
+                 {       
+                   const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
+                   if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
+                     {
+                       __base = 16;
+                       ++__beg;
+                       __found_num = false;
+                     }
+                   else
+                     __base = 8;
+                 }           
+             }
+           else if (__base == 16 && __beg != __end)
+             {
+               const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
+               if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
+                 {
+                   ++__beg;
+                   __found_num = false;
+                 }
+             }
+         }
 
-      // Extract.
-      string __found_grouping;
-      int __sep_pos = 0;
-      for (; __beg != __end; ++__beg)
-        {
-         const char_type __c = *__beg;
-          const char_type* __p = __traits_type::find(__lit + _S_izero,
-                                                    __len, __c);
-          if (__p)
-           {
-             // Try first for acceptable digit; record it if found.
-             __xtrc += _S_atoms_in[__p - __lit];
-             ++__sep_pos;
-           }
-          else if (__traits_type::eq(__c, __lc->_M_thousands_sep)
-                  && __lc->_M_use_grouping)
-           {
-              // NB: Thousands separator at the beginning of a string
-              // is a no-no, as is two consecutive thousands separators.
-              if (__sep_pos)
-                {
-                  __found_grouping += static_cast<char>(__sep_pos);
-                  __sep_pos = 0;
-                }
-              else
-               {
-                 __err |= ios_base::failbit;
+       // At this point, base is determined. If not hex, only allow
+       // base digits as valid input.
+       const size_t __len = __base == 16 ? _S_iend : __base;
+
+       // Extract.
+       string __found_grouping;
+       int __sep_pos = 0;
+       bool __overflow = false;
+       _ValueT __result = 0;
+       const char_type* __lit_zero = __lit + _S_izero;
+       if (__negative)
+         {
+           const _ValueT __min = numeric_limits<_ValueT>::min() / __base;
+           for (; __beg != __end; ++__beg)
+             {
+               const char_type* __p = __traits_type::find(__lit_zero,
+                                                          __len, *__beg);
+               if (__p)
+                 {
+                   int __digit = __p - __lit_zero;
+                   if (__digit > 15)
+                     __digit -= 6;
+                   if (__result < __min)
+                     __overflow = true;
+                   else
+                     {
+                       const _ValueT __new_result = __result * __base - __digit;
+                       if (__result)
+                         __overflow |= __new_result >= __result;
+                       __result = __new_result;
+                       ++__sep_pos;
+                       __found_num = true;
+                     }
+                 }
+               else if (__lc->_M_use_grouping
+                        && __traits_type::eq(*__beg, __lc->_M_thousands_sep))
+                 {
+                   // NB: Thousands separator at the beginning of a string
+                   // is a no-no, as is two consecutive thousands separators.
+                   if (__sep_pos)
+                     {
+                       __found_grouping += static_cast<char>(__sep_pos);
+                       __sep_pos = 0;
+                     }
+                   else
+                     {
+                       __err |= ios_base::failbit;
+                       break;
+                     }
+                 }
+               else
+                 // Not a valid input item.
                  break;
-               }
-            }
-         else
-           // Not a valid input item.
-           break;
-        }
+             }
+         }
+       else
+         {
+           const _ValueT __max = numeric_limits<_ValueT>::max() / __base;
+           for (; __beg != __end; ++__beg)
+             {
+               const char_type* __p = __traits_type::find(__lit_zero,
+                                                          __len, *__beg);
+               if (__p)
+                 {
+                   int __digit = __p - __lit_zero;
+                   if (__digit > 15)
+                     __digit -= 6;
+                   if (__result > __max)
+                     __overflow = true;
+                   else
+                     {
+                       const _ValueT __new_result = __result * __base + __digit;
+                       if (__result)
+                         __overflow |= __new_result <= __result;
+                       __result = __new_result;
+                       ++__sep_pos;
+                       __found_num = true;
+                     }
+                 }
+               else if (__lc->_M_use_grouping
+                        && __traits_type::eq(*__beg, __lc->_M_thousands_sep))
+                 {
+                   if (__sep_pos)
+                     {
+                       __found_grouping += static_cast<char>(__sep_pos);
+                       __sep_pos = 0;
+                     }
+                   else
+                     {
+                       __err |= ios_base::failbit;
+                       break;
+                     }
+                 }
+               else
+                 break;
+             }
+         }
 
-      // Digit grouping is checked. If grouping and found_grouping don't
-      // match, then get very very upset, and set failbit.
-      if (__lc->_M_use_grouping && __found_grouping.size())
-        {
-          // Add the ending grouping.
-          __found_grouping += static_cast<char>(__sep_pos);
+       // Digit grouping is checked. If grouping and found_grouping don't
+       // match, then get very very upset, and set failbit.
+       if (__lc->_M_use_grouping && __found_grouping.size())
+         {
+           // Add the ending grouping.
+           __found_grouping += static_cast<char>(__sep_pos);
+           
+           const string __grouping = __lc->_M_grouping;
+           if (!std::__verify_grouping(__grouping, __found_grouping))
+             __err |= ios_base::failbit;
+         }
 
-         const string __grouping = __lc->_M_grouping;
-          if (!std::__verify_grouping(__grouping, __found_grouping))
-           __err |= ios_base::failbit;
-        }
+       if (!(__err & ios_base::failbit)
+           && !__overflow && __found_num)
+         __v = __result;
+       else
+         __err |= ios_base::failbit;
 
-      // Finish up.
-      __xtrc += char();
-      if (__beg == __end)
-        __err |= ios_base::eofbit;
-      return __beg;
-    }
+       if (__beg == __end)
+         __err |= ios_base::eofbit;
+       return __beg;
+      }
 
   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   // 17.  Bad bool parsing
@@ -407,26 +457,21 @@ namespace std
     {
       if (!(__io.flags() & ios_base::boolalpha))
         {
-         // Parse bool values as unsigned long.
+         // Parse bool values as long.
           // NB: We can't just call do_get(long) here, as it might
           // refer to a derived class.
-          string __xtrc;
-          int __base;
-          __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
-
-         unsigned long __ul; 
-         std::__convert_to_v(__xtrc.c_str(), __ul, __err, 
-                             _S_get_c_locale(), __base);
-         if (!(__err & ios_base::failbit) && __ul <= 1)
-           __v = __ul;
-         else 
+         long __l = -1;
+          __beg = _M_extract_int(__beg, __end, __io, __err, __l);
+         if (__l == 0 || __l == 1)
+           __v = __l;
+         else
             __err |= ios_base::failbit;
         }
       else
         {
          // Parse bool values as alphanumeric.
-         typedef char_traits<_CharT>           __traits_type;
-         typedef typename numpunct<_CharT>::__cache_type       __cache_type;
+         typedef char_traits<_CharT>                     __traits_type;
+         typedef typename numpunct<_CharT>::__cache_type __cache_type;
          __use_cache<__cache_type> __uc;
          const locale& __loc = __io._M_getloc();
          const __cache_type* __lc = __uc(__loc);
@@ -473,68 +518,28 @@ namespace std
     num_get<_CharT, _InIter>::
     do_get(iter_type __beg, iter_type __end, ios_base& __io,
            ios_base::iostate& __err, long& __v) const
-    {
-      string __xtrc;
-      int __base;
-      __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
-      std::__convert_to_v(__xtrc.c_str(), __v, __err,
-                         _S_get_c_locale(), __base);
-      return __beg;
-    }
+    { return _M_extract_int(__beg, __end, __io, __err, __v); }
 
   template<typename _CharT, typename _InIter>
     _InIter
     num_get<_CharT, _InIter>::
     do_get(iter_type __beg, iter_type __end, ios_base& __io,
            ios_base::iostate& __err, unsigned short& __v) const
-    {
-      string __xtrc;
-      int __base;
-      __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
-      unsigned long __ul;
-      std::__convert_to_v(__xtrc.c_str(), __ul, __err,
-                         _S_get_c_locale(), __base);
-      if (!(__err & ios_base::failbit) 
-         && __ul <= numeric_limits<unsigned short>::max())
-       __v = static_cast<unsigned short>(__ul);
-      else 
-       __err |= ios_base::failbit;
-      return __beg;
-    }
+    { return _M_extract_int(__beg, __end, __io, __err, __v); } 
 
   template<typename _CharT, typename _InIter>
     _InIter
     num_get<_CharT, _InIter>::
     do_get(iter_type __beg, iter_type __end, ios_base& __io,
            ios_base::iostate& __err, unsigned int& __v) const
-    {
-      string __xtrc;
-      int __base;
-      __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
-      unsigned long __ul;
-      std::__convert_to_v(__xtrc.c_str(), __ul, __err,
-                         _S_get_c_locale(), __base);
-      if (!(__err & ios_base::failbit) 
-         && __ul <= numeric_limits<unsigned int>::max())
-       __v = static_cast<unsigned int>(__ul);
-      else 
-       __err |= ios_base::failbit;
-      return __beg;
-    }
+    { return _M_extract_int(__beg, __end, __io, __err, __v); }
 
   template<typename _CharT, typename _InIter>
     _InIter
     num_get<_CharT, _InIter>::
     do_get(iter_type __beg, iter_type __end, ios_base& __io,
            ios_base::iostate& __err, unsigned long& __v) const
-    {
-      string __xtrc;
-      int __base;
-      __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
-      std::__convert_to_v(__xtrc.c_str(), __v, __err,
-                         _S_get_c_locale(), __base);
-      return __beg;
-    }
+    { return _M_extract_int(__beg, __end, __io, __err, __v); }
 
 #ifdef _GLIBCXX_USE_LONG_LONG
   template<typename _CharT, typename _InIter>
@@ -542,28 +547,14 @@ namespace std
     num_get<_CharT, _InIter>::
     do_get(iter_type __beg, iter_type __end, ios_base& __io,
            ios_base::iostate& __err, long long& __v) const
-    {
-      string __xtrc;
-      int __base;
-      __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
-      std::__convert_to_v(__xtrc.c_str(), __v, __err,
-                         _S_get_c_locale(), __base);
-      return __beg;
-    }
+    { return _M_extract_int(__beg, __end, __io, __err, __v); }
 
   template<typename _CharT, typename _InIter>
     _InIter
     num_get<_CharT, _InIter>::
     do_get(iter_type __beg, iter_type __end, ios_base& __io,
            ios_base::iostate& __err, unsigned long long& __v) const
-    {
-      string __xtrc;
-      int __base;
-      __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
-      std::__convert_to_v(__xtrc.c_str(), __v, __err,
-                         _S_get_c_locale(), __base);
-      return __beg;
-    }
+    { return _M_extract_int(__beg, __end, __io, __err, __v); }
 #endif
 
   template<typename _CharT, typename _InIter>
@@ -575,8 +566,7 @@ namespace std
       string __xtrc;
       __xtrc.reserve(32);
       __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
-      std::__convert_to_v(__xtrc.c_str(), __v, __err,
-                         _S_get_c_locale());
+      std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
       return __beg;
     }
 
@@ -619,16 +609,12 @@ namespace std
                                   | ios_base::uppercase | ios_base::internal);
       __io.flags(__fmt & __fmtmask | (ios_base::hex | ios_base::showbase));
 
-      string __xtrc;
-      int __base;
-      __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
+      unsigned long __ul;
+      __beg = _M_extract_int(__beg, __end, __io, __err, __ul);
 
       // Reset from hex formatted input.
       __io.flags(__fmt);
 
-      unsigned long __ul;
-      std::__convert_to_v(__xtrc.c_str(), __ul, __err, 
-                         _S_get_c_locale(), __base);
       if (!(__err & ios_base::failbit))
        __v = reinterpret_cast<void*>(__ul);
       else 
@@ -794,7 +780,7 @@ namespace std
       _OutIter
       num_put<_CharT, _OutIter>::
       _M_insert_int(_OutIter __s, ios_base& __io, _CharT __fill, 
-                    _ValueT __v) const
+                   _ValueT __v) const
       {
        typedef typename numpunct<_CharT>::__cache_type __cache_type;
        __use_cache<__cache_type> __uc;
index cb3304d27d9b7b962a5f33dc2d4b6181263090cf..7a41ef83e7cb9c8b47af30491a554748adc859b4 100644 (file)
@@ -55,6 +55,50 @@ namespace std
   template class numpunct_byname<C>;
   template class num_get<C, istreambuf_iterator<C> >;
   template class num_put<C, ostreambuf_iterator<C> >; 
+  template
+    istreambuf_iterator<C>
+    num_get<C, istreambuf_iterator<C> >::
+    _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+                  ios_base&, ios_base::iostate&,
+                  long&) const;
+
+  template
+    istreambuf_iterator<C>
+    num_get<C, istreambuf_iterator<C> >::
+    _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+                  ios_base&, ios_base::iostate&, 
+                  unsigned short&) const;
+
+  template
+    istreambuf_iterator<C>
+    num_get<C, istreambuf_iterator<C> >::
+    _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+                  ios_base&, ios_base::iostate&,
+                  unsigned int&) const;
+
+  template
+    istreambuf_iterator<C>
+    num_get<C, istreambuf_iterator<C> >::
+    _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+                  ios_base&, ios_base::iostate&,
+                  unsigned long&) const;
+
+#ifdef _GLIBCXX_USE_LONG_LONG
+  template
+    istreambuf_iterator<C>
+    num_get<C, istreambuf_iterator<C> >::
+    _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+                  ios_base&, ios_base::iostate&,
+                  long long&) const;
+
+  template
+    istreambuf_iterator<C>
+    num_get<C, istreambuf_iterator<C> >::
+    _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+                  ios_base&, ios_base::iostate&,
+                  unsigned long long&) const;
+#endif
+
   template
     ostreambuf_iterator<C>
     num_put<C, ostreambuf_iterator<C> >::
index 6a0ccf21257f6cd3fcabfaefd5d63d8cd2219b6f..da975f0c78fb168e036984da89f7b0afe48e0cd4 100644 (file)
@@ -53,7 +53,7 @@ namespace std
   const money_base::pattern 
   money_base::_S_default_pattern =  { {symbol, sign, none, value} };
 
-  const char* __num_base::_S_atoms_in = "-+xX0123456789eEabcdfABCDF";
+  const char* __num_base::_S_atoms_in = "-+xX0123456789abcdefABCDEF";
   const char* __num_base::_S_atoms_out ="-+xX0123456789abcdef0123456789ABCDEF";
 
   // _GLIBCXX_RESOLVE_LIB_DEFECTS