natDouble.cc (parseDouble): Cannot use errno to check for errors...
authorPer Bothner <bothner@gcc.gnu.org>
Sat, 24 Mar 2001 00:59:57 +0000 (16:59 -0800)
committerPer Bothner <bothner@gcc.gnu.org>
Sat, 24 Mar 2001 00:59:57 +0000 (16:59 -0800)
* java/lang/natDouble.cc (parseDouble):  Cannot use errno to
check for errors, since we don't want to throw exception on
overflow/underflow.  Instead, trim whitespace, and then check that
_strtod_r uses up all the rest of the string.

From-SVN: r40800

libjava/java/lang/natDouble.cc

index 9ed7e53910d40f0c5a8d4f8c7f089bdc6b9ed5bd..af2d70ad6f3e890f5cc703b92c8f52a724590a3f 100644 (file)
@@ -15,6 +15,7 @@ details.  */
 #include <gcj/cni.h>
 #include <java/lang/String.h>
 #include <java/lang/Double.h>
+#include <java/lang/Character.h>
 #include <java/lang/NumberFormatException.h>
 #include <jvm.h>
 
@@ -160,19 +161,28 @@ jdouble
 java::lang::Double::parseDouble(jstring str)
 {
   int length = str->length();
-  // Note that UTF can expand 3x.
-
-  char *data = (char *) __builtin_alloca (3 * length + 1);
-
-  data[_Jv_GetStringUTFRegion (str, 0, length, data)] = 0; 
-
-  struct _Jv_reent reent;  
-  memset (&reent, 0, sizeof reent);
-
-  double val = _strtod_r (&reent, data, NULL);
-
-  if (reent._errno)
-    _Jv_Throw (new NumberFormatException);
-
-  return val;
+  while (length > 0
+        && Character::isWhitespace(str->charAt(length - 1)))
+    length--;
+  jsize start = 0;
+  while (length > 0
+        && Character::isWhitespace(str->charAt(start)))
+    start++, length--;
+
+  if (length > 0)
+    {
+      // Note that UTF can expand 3x.
+      char *data = (char *) __builtin_alloca (3 * length + 1);
+      jsize blength = _Jv_GetStringUTFRegion (str, start, length, data);
+      data[blength] = 0; 
+
+      struct _Jv_reent reent;  
+      memset (&reent, 0, sizeof reent);
+
+      char *endptr;
+      double val = _strtod_r (&reent, data, &endptr);
+      if (endptr == data + blength)
+       return val;
+    }
+  _Jv_Throw (new NumberFormatException);
 }