annotate Python/strtod.c @ 53207:fe99a562b708

Silence compiler warnings on VS8.0
author Mark Dickinson <dickinsm@gmail.com>
date Fri, 17 Apr 2009 19:29:46 +0000
parents 31582485fbfc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52949
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
1 #include "pyconfig.h"
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
2
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
3 /* comp.sources.misc strtod(), as posted in comp.lang.tcl,
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
4 with bugfix for "123000.0" and acceptance of space after 'e' sign nuked.
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
5
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
6 ************************************************************
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
7 * YOU MUST EDIT THE MACHINE-DEPENDENT DEFINITIONS BELOW!!! *
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
8 ************************************************************
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
9 */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
10
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
11 /* File : stdtod.c (Modified version of str2dbl.c)
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
12 Author : Richard A. O'Keefe @ Quintus Computer Systems, Inc.
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
13 Updated: Tuesday August 2nd, 1988
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
14 Defines: double strtod (char *str, char**ptr)
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
15 */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
16
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
17 /* This is an implementation of the strtod() function described in the
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
18 System V manuals, with a different name to avoid linker problems.
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
19 All that str2dbl() does itself is check that the argument is well-formed
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
20 and is in range. It leaves the work of conversion to atof(), which is
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
21 assumed to exist and deliver correct results (if they can be represented).
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
22
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
23 There are two reasons why this should be provided to the net:
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
24 (a) some UNIX systems do not yet have strtod(), or do not have it
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
25 available in the BSD "universe" (but they do have atof()).
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
26 (b) some of the UNIX systems that *do* have it get it wrong.
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
27 (some crash with large arguments, some assign the wrong *ptr value).
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
28 There is a reason why *we* are providing it: we need a correct version
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
29 of strtod(), and if we give this one away maybe someone will look for
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
30 mistakes in it and fix them for us (:-).
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
31 */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
32
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
33 /* The following constants are machine-specific. MD{MIN,MAX}EXPT are
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
34 integers and MD{MIN,MAX}FRAC are strings such that
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
35 0.${MDMAXFRAC}e${MDMAXEXPT} is the largest representable double,
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
36 0.${MDMINFRAC}e${MDMINEXPT} is the smallest representable +ve double
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
37 MD{MIN,MAX}FRAC must not have any trailing zeros.
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
38 The values here are for IEEE-754 64-bit floats.
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
39 It is not perfectly clear to me whether an IEEE infinity should be
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
40 returned for overflow, nor what a portable way of writing one is,
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
41 so HUGE is just 0.MAXFRAC*10**MAXEXPT (this seems still to be the
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
42 UNIX convention).
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
43
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
44 I do know about <values.h>, but the whole point of this file is that
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
45 we can't always trust that stuff to be there or to be correct.
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
46 */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
47 static int MDMINEXPT = -323;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
48 static char MDMINFRAC[] = "494065645841246544";
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
49 static double ZERO = 0.0;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
50
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
51 static int MDMAXEXPT = 309;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
52 static char MDMAXFRAC[] = "17976931348623157";
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
53 static double HUGE = 1.7976931348623157e308;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
54
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
55 extern double atof(const char *); /* Only called when result known to be ok */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
56
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
57 #ifdef HAVE_ERRNO_H
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
58 #include <errno.h>
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
59 #endif
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
60 extern int errno;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
61
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
62 double strtod(char *str, char **ptr)
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
63 {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
64 int sign, scale, dotseen;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
65 int esign, expt;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
66 char *save;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
67 register char *sp, *dp;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
68 register int c;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
69 char *buforg, *buflim;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
70 char buffer[64]; /* 45-digit significant + */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
71 /* 13-digit exponent */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
72 sp = str;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
73 while (*sp == ' ') sp++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
74 sign = 1;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
75 if (*sp == '-') sign -= 2, sp++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
76 dotseen = 0, scale = 0;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
77 dp = buffer;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
78 *dp++ = '0'; *dp++ = '.';
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
79 buforg = dp, buflim = buffer+48;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
80 for (save = sp; c = *sp; sp++)
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
81 if (c == '.') {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
82 if (dotseen) break;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
83 dotseen++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
84 } else
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
85 if ((unsigned)(c-'0') > (unsigned)('9'-'0')) {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
86 break;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
87 } else
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
88 if (c == '0') {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
89 if (dp != buforg) {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
90 /* This is not the first digit, so we want to keep it */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
91 if (dp < buflim) *dp++ = c;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
92 if (!dotseen) scale++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
93 } else {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
94 /* No non-zero digits seen yet */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
95 /* If a . has been seen, scale must be adjusted */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
96 if (dotseen) scale--;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
97 }
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
98 } else {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
99 /* This is a nonzero digit, so we want to keep it */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
100 if (dp < buflim) *dp++ = c;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
101 /* If it precedes a ., scale must be adjusted */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
102 if (!dotseen) scale++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
103 }
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
104 if (sp == save) {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
105 if (ptr) *ptr = str;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
106 errno = EDOM; /* what should this be? */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
107 return ZERO;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
108 }
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
109
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
110 while (dp > buforg && dp[-1] == '0') --dp;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
111 if (dp == buforg) *dp++ = '0';
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
112 *dp = '\0';
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
113 /* Now the contents of buffer are
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
114 +--+--------+-+--------+
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
115 |0.|fraction|\|leftover|
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
116 +--+--------+-+--------+
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
117 ^dp points here
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
118 where fraction begins with 0 iff it is "0", and has at most
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
119 45 digits in it, and leftover is at least 16 characters.
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
120 */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
121 save = sp, expt = 0, esign = 1;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
122 do {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
123 c = *sp++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
124 if (c != 'e' && c != 'E') break;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
125 c = *sp++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
126 if (c == '-') esign -= 2, c = *sp++; else
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
127 if (c == '+' /* || c == ' ' */ ) c = *sp++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
128 if ((unsigned)(c-'0') > (unsigned)('9'-'0')) break;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
129 while (c == '0') c = *sp++;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
130 for (; (unsigned)(c-'0') <= (unsigned)('9'-'0'); c = *sp++)
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
131 expt = expt*10 + c-'0';
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
132 if (esign < 0) expt = -expt;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
133 save = sp-1;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
134 } while (0);
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
135 if (ptr) *ptr = save;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
136 expt += scale;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
137 /* Now the number is sign*0.fraction*10**expt */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
138 errno = ERANGE;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
139 if (expt > MDMAXEXPT) {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
140 return HUGE*sign;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
141 } else
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
142 if (expt == MDMAXEXPT) {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
143 if (strcmp(buforg, MDMAXFRAC) > 0) return HUGE*sign;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
144 } else
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
145 if (expt < MDMINEXPT) {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
146 return ZERO*sign;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
147 } else
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
148 if (expt == MDMINEXPT) {
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
149 if (strcmp(buforg, MDMINFRAC) < 0) return ZERO*sign;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
150 }
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
151 /* We have now established that the number can be */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
152 /* represented without overflow or underflow */
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
153 (void) sprintf(dp, "E%d", expt);
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
154 errno = 0;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
155 return atof(buffer)*sign;
31582485fbfc Revert removal of atof.c and strtod.c in r71341. We're not quite
Mark Dickinson <dickinsm@gmail.com>
parents:
diff changeset
156 }