mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			locale_facets.tcc (num_get<>::_M_extract_float): According to 22.2.3.1...
2004-02-28 Paolo Carlini <pcarlini@suse.de> * include/bits/locale_facets.tcc (num_get<>::_M_extract_float): According to 22.2.3.1, p2, 'units' may be followed by 'e' with no 'decimal-point' in the middle: in this case too we must fix up __found_grouping; slightly tweak. * testsuite/22_locale/num_get/get/char/14.cc: New. * testsuite/22_locale/num_get/get/wchar_t/14.cc: New. From-SVN: r78625
This commit is contained in:
		
							parent
							
								
									757f9053a2
								
							
						
					
					
						commit
						0e1b98cccc
					
				|  | @ -1,3 +1,12 @@ | ||||||
|  | 2004-02-28  Paolo Carlini  <pcarlini@suse.de> | ||||||
|  | 
 | ||||||
|  | 	* include/bits/locale_facets.tcc (num_get<>::_M_extract_float): | ||||||
|  | 	According to 22.2.3.1, p2, 'units' may be followed by 'e' with | ||||||
|  | 	no 'decimal-point' in the middle: in this case too we must fix | ||||||
|  | 	up __found_grouping; slightly tweak. | ||||||
|  | 	* testsuite/22_locale/num_get/get/char/14.cc: New. | ||||||
|  | 	* testsuite/22_locale/num_get/get/wchar_t/14.cc: New. | ||||||
|  | 
 | ||||||
| 2004-02-27  Eric Christopher  <echristo@redhat.com> | 2004-02-27  Eric Christopher  <echristo@redhat.com> | ||||||
|             Phil Edwards  <phil@codesourcery.com> |             Phil Edwards  <phil@codesourcery.com> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -188,8 +188,7 @@ namespace std | ||||||
| 	      && (!__lc->_M_use_grouping | 	      && (!__lc->_M_use_grouping | ||||||
| 		  || !__traits_type::eq(__c, __lc->_M_thousands_sep))) | 		  || !__traits_type::eq(__c, __lc->_M_thousands_sep))) | ||||||
| 	    { | 	    { | ||||||
| 	      __xtrc += __plus ? _S_atoms_in[_S_iplus] | 	      __xtrc += __plus ? '+' : '-'; | ||||||
| 		               : _S_atoms_in[_S_iminus]; |  | ||||||
| 	      ++__beg; | 	      ++__beg; | ||||||
| 	    } | 	    } | ||||||
| 	} | 	} | ||||||
|  | @ -206,7 +205,7 @@ namespace std | ||||||
| 	    { | 	    { | ||||||
| 	      if (!__found_mantissa) | 	      if (!__found_mantissa) | ||||||
| 		{ | 		{ | ||||||
| 		  __xtrc += _S_atoms_in[_S_izero]; | 		  __xtrc += '0'; | ||||||
| 		  __found_mantissa = true; | 		  __found_mantissa = true; | ||||||
| 		} | 		} | ||||||
| 	      ++__beg; | 	      ++__beg; | ||||||
|  | @ -223,6 +222,7 @@ namespace std | ||||||
| 	__found_grouping.reserve(32); | 	__found_grouping.reserve(32); | ||||||
|       int __sep_pos = 0; |       int __sep_pos = 0; | ||||||
|       bool __e; |       bool __e; | ||||||
|  |       const char_type* __lit_zero = __lit + _S_izero; | ||||||
|       const char_type* __q; |       const char_type* __q; | ||||||
|       while (__beg != __end) |       while (__beg != __end) | ||||||
|         { |         { | ||||||
|  | @ -267,7 +267,7 @@ namespace std | ||||||
| 	      else | 	      else | ||||||
| 		break; | 		break; | ||||||
| 	    } | 	    } | ||||||
|           else if (__q = __traits_type::find(__lit + _S_izero, 10, __c)) |           else if (__q = __traits_type::find(__lit_zero, 10, __c)) | ||||||
| 	    { | 	    { | ||||||
| 	      __xtrc += _S_atoms_in[__q - __lit]; | 	      __xtrc += _S_atoms_in[__q - __lit]; | ||||||
| 	      __found_mantissa = true; | 	      __found_mantissa = true; | ||||||
|  | @ -279,7 +279,9 @@ namespace std | ||||||
| 		   && __found_mantissa && !__found_sci) | 		   && __found_mantissa && !__found_sci) | ||||||
| 	    { | 	    { | ||||||
| 	      // Scientific notation. | 	      // Scientific notation. | ||||||
| 	      __xtrc += __e ? _S_atoms_in[_S_ie] : _S_atoms_in[_S_iE]; | 	      if (__found_grouping.size() && !__found_dec) | ||||||
|  | 		__found_grouping += static_cast<char>(__sep_pos); | ||||||
|  | 	      __xtrc += __e ? 'e' : 'E'; | ||||||
| 	      __found_sci = true; | 	      __found_sci = true; | ||||||
| 
 | 
 | ||||||
| 	      // Remove optional plus or minus sign, if they exist. | 	      // Remove optional plus or minus sign, if they exist. | ||||||
|  | @ -289,8 +291,7 @@ namespace std | ||||||
| 							__lit[_S_iplus]); | 							__lit[_S_iplus]); | ||||||
| 		  if (__plus || __traits_type::eq(*__beg, __lit[_S_iminus])) | 		  if (__plus || __traits_type::eq(*__beg, __lit[_S_iminus])) | ||||||
| 		    { | 		    { | ||||||
| 		      __xtrc += __plus ? _S_atoms_in[_S_iplus] | 		      __xtrc += __plus ? '+' : '-'; | ||||||
| 			               : _S_atoms_in[_S_iminus]; |  | ||||||
| 		      ++__beg; | 		      ++__beg; | ||||||
| 		    } | 		    } | ||||||
| 		} | 		} | ||||||
|  | @ -304,8 +305,8 @@ namespace std | ||||||
|       // match, then get very very upset, and set failbit. |       // match, then get very very upset, and set failbit. | ||||||
|       if (__found_grouping.size()) |       if (__found_grouping.size()) | ||||||
|         { |         { | ||||||
|           // Add the ending grouping if a decimal wasn't found. |           // Add the ending grouping if a decimal or 'e'/'E' wasn't found. | ||||||
| 	  if (!__found_dec) | 	  if (!__found_dec && !__found_sci) | ||||||
| 	    __found_grouping += static_cast<char>(__sep_pos); | 	    __found_grouping += static_cast<char>(__sep_pos); | ||||||
| 
 | 
 | ||||||
|           if (!std::__verify_grouping(__lc->_M_grouping, __lc->_M_grouping_size, |           if (!std::__verify_grouping(__lc->_M_grouping, __lc->_M_grouping_size, | ||||||
|  |  | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | // 2004-02-28  Paolo Carlini  <pcarlini@suse.de>
 | ||||||
|  | 
 | ||||||
|  | // Copyright (C) 2004 Free Software Foundation
 | ||||||
|  | //
 | ||||||
|  | // This file is part of the GNU ISO C++ Library.  This library is free
 | ||||||
|  | // software; you can redistribute it and/or modify it under the
 | ||||||
|  | // terms of the GNU General Public License as published by the
 | ||||||
|  | // Free Software Foundation; either version 2, or (at your option)
 | ||||||
|  | // any later version.
 | ||||||
|  | 
 | ||||||
|  | // This library is distributed in the hope that it will be useful,
 | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||||
|  | // GNU General Public License for more details.
 | ||||||
|  | 
 | ||||||
|  | // You should have received a copy of the GNU General Public License along
 | ||||||
|  | // with this library; see the file COPYING.  If not, write to the Free
 | ||||||
|  | // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 | ||||||
|  | // USA.
 | ||||||
|  | 
 | ||||||
|  | // 22.2.2.1.1  num_get members
 | ||||||
|  | 
 | ||||||
|  | #include <locale> | ||||||
|  | #include <sstream> | ||||||
|  | #include <testsuite_hooks.h> | ||||||
|  | 
 | ||||||
|  | struct Punct: std::numpunct<char> | ||||||
|  | { | ||||||
|  |   std::string do_grouping() const { return "\1"; } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void test01() | ||||||
|  | { | ||||||
|  |   using namespace std; | ||||||
|  |   typedef istreambuf_iterator<char> iterator_type; | ||||||
|  |    | ||||||
|  |   bool test __attribute__((unused)) = true; | ||||||
|  | 
 | ||||||
|  |   istringstream iss; | ||||||
|  |   iss.imbue(locale(iss.getloc(), static_cast<numpunct<char>*>(new Punct))); | ||||||
|  |   const num_get<char>& ng = use_facet<num_get<char> >(iss.getloc());  | ||||||
|  | 
 | ||||||
|  |   ios_base::iostate err = ios_base::goodbit; | ||||||
|  |   iterator_type end; | ||||||
|  |   double d = 0.0; | ||||||
|  |   double d1 = 1000.0; | ||||||
|  |    | ||||||
|  |   iss.str("1,0e2"); | ||||||
|  |   err = ios_base::goodbit; | ||||||
|  |   end = ng.get(iss.rdbuf(), 0, iss, err, d); | ||||||
|  |   VERIFY( err == ios_base::eofbit ); | ||||||
|  |   VERIFY( d == d1 ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   test01(); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | // 2004-02-28  Paolo Carlini  <pcarlini@suse.de>
 | ||||||
|  | 
 | ||||||
|  | // Copyright (C) 2004 Free Software Foundation
 | ||||||
|  | //
 | ||||||
|  | // This file is part of the GNU ISO C++ Library.  This library is free
 | ||||||
|  | // software; you can redistribute it and/or modify it under the
 | ||||||
|  | // terms of the GNU General Public License as published by the
 | ||||||
|  | // Free Software Foundation; either version 2, or (at your option)
 | ||||||
|  | // any later version.
 | ||||||
|  | 
 | ||||||
|  | // This library is distributed in the hope that it will be useful,
 | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||||
|  | // GNU General Public License for more details.
 | ||||||
|  | 
 | ||||||
|  | // You should have received a copy of the GNU General Public License along
 | ||||||
|  | // with this library; see the file COPYING.  If not, write to the Free
 | ||||||
|  | // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 | ||||||
|  | // USA.
 | ||||||
|  | 
 | ||||||
|  | // 22.2.2.1.1  num_get members
 | ||||||
|  | 
 | ||||||
|  | #include <locale> | ||||||
|  | #include <sstream> | ||||||
|  | #include <testsuite_hooks.h> | ||||||
|  | 
 | ||||||
|  | struct Punct: std::numpunct<wchar_t> | ||||||
|  | { | ||||||
|  |   std::string do_grouping() const { return "\1"; } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void test01() | ||||||
|  | { | ||||||
|  |   using namespace std; | ||||||
|  |   typedef istreambuf_iterator<wchar_t> iterator_type; | ||||||
|  |    | ||||||
|  |   bool test __attribute__((unused)) = true; | ||||||
|  | 
 | ||||||
|  |   wistringstream iss; | ||||||
|  |   iss.imbue(locale(iss.getloc(), static_cast<numpunct<wchar_t>*>(new Punct))); | ||||||
|  |   const num_get<wchar_t>& ng = use_facet<num_get<wchar_t> >(iss.getloc());  | ||||||
|  | 
 | ||||||
|  |   ios_base::iostate err = ios_base::goodbit; | ||||||
|  |   iterator_type end; | ||||||
|  |   double d = 0.0; | ||||||
|  |   double d1 = 1000.0; | ||||||
|  |    | ||||||
|  |   iss.str(L"1,0e2"); | ||||||
|  |   err = ios_base::goodbit; | ||||||
|  |   end = ng.get(iss.rdbuf(), 0, iss, err, d); | ||||||
|  |   VERIFY( err == ios_base::eofbit ); | ||||||
|  |   VERIFY( d == d1 ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   test01(); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	 Paolo Carlini
						Paolo Carlini