mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
| /* Implementation of strtod for systems with atof.
 | |
|    Copyright (C) 1991-2017 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;
 | |
| }
 |