[Python-checkins] commit of r41752 - in python/trunk: Lib/test/test_builtin.py Misc/NEWS Python/pystrtod.c

neal.norwitz python-checkins at python.org
Sun Dec 18 06:03:20 CET 2005


Author: neal.norwitz
Date: Sun Dec 18 06:03:17 2005
New Revision: 41752
Modified:
 python/trunk/Lib/test/test_builtin.py
 python/trunk/Misc/NEWS
 python/trunk/Python/pystrtod.c
Log:
Get float() to be more portable across platforms. Disable hex strings.
Modified: python/trunk/Lib/test/test_builtin.py
==============================================================================
--- python/trunk/Lib/test/test_builtin.py	(original)
+++ python/trunk/Lib/test/test_builtin.py	Sun Dec 18 06:03:17 2005
@@ -545,6 +545,8 @@
 self.assertEqual(float(314), 314.0)
 self.assertEqual(float(314L), 314.0)
 self.assertEqual(float(" 3.14 "), 3.14)
+ self.assertRaises(ValueError, float, " 0x3.1 ")
+ self.assertRaises(ValueError, float, " -0x3.p-1 ")
 if have_unicode:
 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
@@ -572,8 +574,8 @@
 self.assertEqual(float(" 3,14 "), 3.14)
 self.assertEqual(float(" +3,14 "), 3.14)
 self.assertEqual(float(" -3,14 "), -3.14)
- self.assertEqual(float(" 0x3.1 "), 3.0625)
- self.assertEqual(float(" -0x3.p-1 "), -1.5)
+ self.assertRaises(ValueError, float, " 0x3.1 ")
+ self.assertRaises(ValueError, float, " -0x3.p-1 ")
 self.assertEqual(float(" 25.e-1 "), 2.5)
 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
 finally:
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Sun Dec 18 06:03:17 2005
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- Support for converting hex strings to floats no longer works.
+ This was not portable. float('0x3') now raises a ValueError.
+
 - Patch #1382163: Expose Subversion revision number to Python. New C API
 function Py_GetBuildNumber(). New attribute sys.build_number. Build number
 is now displayed in interactive prompt banner.
Modified: python/trunk/Python/pystrtod.c
==============================================================================
--- python/trunk/Python/pystrtod.c	(original)
+++ python/trunk/Python/pystrtod.c	Sun Dec 18 06:03:17 2005
@@ -38,8 +38,7 @@
 * Return value: the #gdouble value.
 **/
 double
-PyOS_ascii_strtod(const char *nptr, 
-	 char **endptr)
+PyOS_ascii_strtod(const char *nptr, char **endptr)
 {
 	char *fail_pos;
 	double val;
@@ -49,7 +48,6 @@
 	const char *p, *decimal_point_pos;
 	const char *end = NULL; /* Silence gcc */
 
-/* 	g_return_val_if_fail (nptr != NULL, 0); */
 	assert(nptr != NULL);
 
 	fail_pos = NULL;
@@ -73,64 +71,36 @@
 		if (*p == '+' || *p == '-')
 			p++;
 
-		if (p[0] == '0' && 
-		 (p[1] == 'x' || p[1] == 'X'))
+		while (ISDIGIT(*p))
+			p++;
+
+		if (*p == '.')
 		{
-			p += 2;
-			 /* HEX - find the (optional) decimal point */
+			decimal_point_pos = p++;
 
-			while (ISXDIGIT(*p))
+			while (ISDIGIT(*p))
 				p++;
 
-			if (*p == '.')
-			{
-				decimal_point_pos = p++;
-
-				while (ISXDIGIT(*p))
-					p++;
-
-				if (*p == 'p' || *p == 'P')
-					p++;
-				if (*p == '+' || *p == '-')
-					p++;
-				while (ISDIGIT(*p))
-					p++;
-				end = p;
-			}
-		}
-		else
-		{
+			if (*p == 'e' || *p == 'E')
+				p++;
+			if (*p == '+' || *p == '-')
+				p++;
 			while (ISDIGIT(*p))
 				p++;
-
-			if (*p == '.')
-			{
-				decimal_point_pos = p++;
-
-				while (ISDIGIT(*p))
-					p++;
-
-				if (*p == 'e' || *p == 'E')
-					p++;
-				if (*p == '+' || *p == '-')
-					p++;
-				while (ISDIGIT(*p))
-					p++;
-				end = p;
-			}
+			end = p;
 		}
-		 /* For the other cases, we need not convert the decimal point */
+		/* For the other cases, we need not convert the decimal point */
 	}
 
-	 /* Set errno to zero, so that we can distinguish zero results
-	 and underflows */
+	/* Set errno to zero, so that we can distinguish zero results
+	 and underflows */
 	errno = 0;
 
 	if (decimal_point_pos)
 	{
 		char *copy, *c;
 
-		 /* We need to convert the '.' to the locale specific decimal point */
+		/* We need to convert the '.' to the locale specific decimal point */
 		copy = malloc(end - nptr + 1 + decimal_point_len);
 
 		c = copy;
@@ -155,8 +125,15 @@
 		free(copy);
 
 	}
-	else
-		val = strtod(nptr, &fail_pos);
+	else {
+		unsigned i = 0;
+		if (nptr[i] == '-')
+			i++;
+		if (nptr[i] == '0' && (nptr[i+1] == 'x' || nptr[i+1] == 'X'))
+			fail_pos = nptr;
+		else
+			val = strtod(nptr, &fail_pos);
+	}
 
 	if (endptr)
 		*endptr = fail_pos;


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /