#include "pyconfig.h"

/* comp.sources.misc strtod(), as posted in comp.lang.tcl,
   with bugfix for "123000.0" and acceptance of space after 'e' sign nuked.

   ************************************************************
   * YOU MUST EDIT THE MACHINE-DEPENDENT DEFINITIONS BELOW!!! *
   ************************************************************
*/

/*  File   : stdtod.c (Modified version of str2dbl.c)
    Author : Richard A. O'Keefe @ Quintus Computer Systems, Inc.
    Updated: Tuesday August 2nd, 1988
    Defines: double strtod (char *str, char**ptr)
*/

/*  This is an implementation of the strtod() function described in the 
    System V manuals, with a different name to avoid linker problems.
    All that str2dbl() does itself is check that the argument is well-formed
    and is in range.  It leaves the work of conversion to atof(), which is
    assumed to exist and deliver correct results (if they can be represented).

    There are two reasons why this should be provided to the net:
    (a) some UNIX systems do not yet have strtod(), or do not have it
        available in the BSD "universe" (but they do have atof()).
    (b) some of the UNIX systems that *do* have it get it wrong.
	(some crash with large arguments, some assign the wrong *ptr value).
    There is a reason why *we* are providing it: we need a correct version
    of strtod(), and if we give this one away maybe someone will look for
    mistakes in it and fix them for us (:-).
*/
    
/*  The following constants are machine-specific.  MD{MIN,MAX}EXPT are
    integers and MD{MIN,MAX}FRAC are strings such that
	0.${MDMAXFRAC}e${MDMAXEXPT} is the largest representable double,
	0.${MDMINFRAC}e${MDMINEXPT} is the smallest representable +ve double
    MD{MIN,MAX}FRAC must not have any trailing zeros.
    The values here are for IEEE-754 64-bit floats.
    It is not perfectly clear to me whether an IEEE infinity should be
    returned for overflow, nor what a portable way of writing one is,
    so HUGE is just 0.MAXFRAC*10**MAXEXPT (this seems still to be the
    UNIX convention).

    I do know about <values.h>, but the whole point of this file is that
    we can't always trust that stuff to be there or to be correct.
*/
static	int	MDMINEXPT	= {-323};
static	char	MDMINFRAC[]	= "494065645841246544";
static	double	ZERO		= 0.0;

static	int	MDMAXEXPT	= { 309};
static	char	MDMAXFRAC[]	= "17976931348623157";
static	double	HUGE		= 1.7976931348623157e308;

extern	double	atof(const char *);		/* Only called when result known to be ok */

#ifndef DONT_HAVE_ERRNO_H
#include <errno.h>
#endif
extern	int	errno;

double strtod(char *str, char **ptr)
{
	int sign, scale, dotseen;
	int esign, expt;
	char *save;
	register char *sp, *dp;
	register int c;
	char *buforg, *buflim;
	char buffer[64];		/* 45-digit significant + */
					/* 13-digit exponent */
	sp = str;
	while (*sp == ' ') sp++;
	sign = 1;
	if (*sp == '-') sign -= 2, sp++;
	dotseen = 0, scale = 0;
	dp = buffer;	
	*dp++ = '0'; *dp++ = '.';
	buforg = dp, buflim = buffer+48;
	for (save = sp; c = *sp; sp++)
	    if (c == '.') {
		if (dotseen) break;
		dotseen++;
	    } else
	    if ((unsigned)(c-'0') > (unsigned)('9'-'0')) {
		break;
	    } else
	    if (c == '0') {
		if (dp != buforg) {
		    /* This is not the first digit, so we want to keep it */
		    if (dp < buflim) *dp++ = c;
		    if (!dotseen) scale++;
		} else {
		    /* No non-zero digits seen yet */
		    /* If a . has been seen, scale must be adjusted */
		    if (dotseen) scale--;
		}
	    } else {
		/* This is a nonzero digit, so we want to keep it */
		if (dp < buflim) *dp++ = c;
		/* If it precedes a ., scale must be adjusted */
		if (!dotseen) scale++;
	    }
	if (sp == save) {
	    if (ptr) *ptr = str;
	    errno = EDOM;		/* what should this be? */
	    return ZERO;
	}
	
	while (dp > buforg && dp[-1] == '0') --dp;
	if (dp == buforg) *dp++ = '0';
	*dp = '\0';
	/*  Now the contents of buffer are
	    +--+--------+-+--------+
	    |0.|fraction|\|leftover|
	    +--+--------+-+--------+
			 ^dp points here
	    where fraction begins with 0 iff it is "0", and has at most
	    45 digits in it, and leftover is at least 16 characters.
	*/
	save = sp, expt = 0, esign = 1;
	do {
	    c = *sp++;
	    if (c != 'e' && c != 'E') break;
	    c = *sp++;
	    if (c == '-') esign -= 2, c = *sp++; else
	    if (c == '+' /* || c == ' ' */ ) c = *sp++;
	    if ((unsigned)(c-'0') > (unsigned)('9'-'0')) break;
	    while (c == '0') c = *sp++;
	    for (; (unsigned)(c-'0') <= (unsigned)('9'-'0'); c = *sp++)
		expt = expt*10 + c-'0';	    
	    if (esign < 0) expt = -expt;
	    save = sp-1;
	} while (0);
	if (ptr) *ptr = save;
	expt += scale;
	/*  Now the number is sign*0.fraction*10**expt  */
	errno = ERANGE;
	if (expt > MDMAXEXPT) {
	    return HUGE*sign;
	} else
	if (expt == MDMAXEXPT) {
	    if (strcmp(buforg, MDMAXFRAC) > 0) return HUGE*sign;
	} else
	if (expt < MDMINEXPT) {
	    return ZERO*sign;
	} else
	if (expt == MDMINEXPT) {
	    if (strcmp(buforg, MDMINFRAC) < 0) return ZERO*sign;
	}
	/*  We have now established that the number can be  */
	/*  represented without overflow or underflow  */
	(void) sprintf(dp, "E%d", expt);
	errno = 0;
	return atof(buffer)*sign;
}
