diff libiberty/strtod.c @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children f6334be47118
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libiberty/strtod.c	Fri Jul 17 14:47:48 2009 +0900
@@ -0,0 +1,136 @@
+/* Implementation of strtod for systems with atof.
+   Copyright (C) 1991, 1995, 2002 Free Software Foundation, Inc.
+
+This file is part of the libiberty 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 GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+
+As a special exception, if you link this library with files
+compiled with a GNU compiler to produce an executable, this does not cause
+the resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why
+the executable file might be covered by the GNU General Public License. */
+
+/*
+
+@deftypefn Supplemental double strtod (const char *@var{string}, char **@var{endptr})
+
+This ISO C function converts the initial portion of @var{string} to a
+@code{double}.  If @var{endptr} is not @code{NULL}, a pointer to the
+character after the last character used in the conversion is stored in
+the location referenced by @var{endptr}.  If no conversion is
+performed, zero is returned and the value of @var{string} is stored in
+the location referenced by @var{endptr}.
+
+@end deftypefn
+
+*/
+
+#include "ansidecl.h"
+#include "safe-ctype.h"
+
+extern double atof (const char *);
+
+/* Disclaimer: this is currently just used by CHILL in GDB and therefore
+   has not been tested well.  It may have been tested for nothing except
+   that it compiles.  */
+
+double
+strtod (char *str, char **ptr)
+{
+  char *p;
+
+  if (ptr == (char **)0)
+    return atof (str);
+  
+  p = str;
+  
+  while (ISSPACE (*p))
+    ++p;
+  
+  if (*p == '+' || *p == '-')
+    ++p;
+
+  /* INF or INFINITY.  */
+  if ((p[0] == 'i' || p[0] == 'I')
+      && (p[1] == 'n' || p[1] == 'N')
+      && (p[2] == 'f' || p[2] == 'F'))
+    {
+      if ((p[3] == 'i' || p[3] == 'I')
+	  && (p[4] == 'n' || p[4] == 'N')
+	  && (p[5] == 'i' || p[5] == 'I')
+	  && (p[6] == 't' || p[6] == 'T')
+	  && (p[7] == 'y' || p[7] == 'Y'))
+	{
+	  *ptr = p + 8;
+	  return atof (str);
+	}
+      else
+	{
+	  *ptr = p + 3;
+	  return atof (str);
+	}
+    }
+
+  /* NAN or NAN(foo).  */
+  if ((p[0] == 'n' || p[0] == 'N')
+      && (p[1] == 'a' || p[1] == 'A')
+      && (p[2] == 'n' || p[2] == 'N'))
+    {
+      p += 3;
+      if (*p == '(')
+	{
+	  ++p;
+	  while (*p != '\0' && *p != ')')
+	    ++p;
+	  if (*p == ')')
+	    ++p;
+	}
+      *ptr = p;
+      return atof (str);
+    }
+
+  /* digits, with 0 or 1 periods in it.  */
+  if (ISDIGIT (*p) || *p == '.')
+    {
+      int got_dot = 0;
+      while (ISDIGIT (*p) || (!got_dot && *p == '.'))
+	{
+	  if (*p == '.')
+	    got_dot = 1;
+	  ++p;
+	}
+
+      /* Exponent.  */
+      if (*p == 'e' || *p == 'E')
+	{
+	  int i;
+	  i = 1;
+	  if (p[i] == '+' || p[i] == '-')
+	    ++i;
+	  if (ISDIGIT (p[i]))
+	    {
+	      while (ISDIGIT (p[i]))
+		++i;
+	      *ptr = p + i;
+	      return atof (str);
+	    }
+	}
+      *ptr = p;
+      return atof (str);
+    }
+  /* Didn't find any digits.  Doesn't look like a number.  */
+  *ptr = str;
+  return 0.0;
+}