annotate Python/strtod.c @ 87680:02d186e3af09 2.7

Fixed JSON tests on wide build when ran from *.pyc files (issue #11489).
author Serhiy Storchaka <storchaka@gmail.com>
date Sun, 01 Dec 2013 17:30:55 +0200
parents b36cb4602e21
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61275
0d14827bcc0d Explicitly add stdio.h and string.h to make strtod.c work standalone.
Brett Cannon <bcannon@gmail.com>
parents: 45214
diff changeset
1 #include <stdio.h>
0d14827bcc0d Explicitly add stdio.h and string.h to make strtod.c work standalone.
Brett Cannon <bcannon@gmail.com>
parents: 45214
diff changeset
2 #include <string.h>
0d14827bcc0d Explicitly add stdio.h and string.h to make strtod.c work standalone.
Brett Cannon <bcannon@gmail.com>
parents: 45214
diff changeset
3
18835
2dea40e40d9d Patch #411138: Rename config.h to pyconfig.h. Closes bug #231774.
Martin v. Löwis <martin@v.loewis.de>
parents: 13658
diff changeset
4 #include "pyconfig.h"
2396
29ca45eb3ab7 for __SC__
Guido van Rossum <guido@python.org>
parents: 749
diff changeset
5
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
6 /* comp.sources.misc strtod(), as posted in comp.lang.tcl,
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
7 with bugfix for "123000.0" and acceptance of space after 'e' sign nuked.
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
8
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
9 ************************************************************
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
10 * YOU MUST EDIT THE MACHINE-DEPENDENT DEFINITIONS BELOW!!! *
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
11 ************************************************************
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
12 */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
13
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
14 /* File : stdtod.c (Modified version of str2dbl.c)
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
15 Author : Richard A. O'Keefe @ Quintus Computer Systems, Inc.
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
16 Updated: Tuesday August 2nd, 1988
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
17 Defines: double strtod (char *str, char**ptr)
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
18 */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
19
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
20 /* This is an implementation of the strtod() function described in the
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
21 System V manuals, with a different name to avoid linker problems.
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
22 All that str2dbl() does itself is check that the argument is well-formed
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
23 and is in range. It leaves the work of conversion to atof(), which is
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
24 assumed to exist and deliver correct results (if they can be represented).
208
f352ea4dff70 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
26 There are two reasons why this should be provided to the net:
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
27 (a) some UNIX systems do not yet have strtod(), or do not have it
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
28 available in the BSD "universe" (but they do have atof()).
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
29 (b) some of the UNIX systems that *do* have it get it wrong.
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
30 (some crash with large arguments, some assign the wrong *ptr value).
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
31 There is a reason why *we* are providing it: we need a correct version
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
32 of strtod(), and if we give this one away maybe someone will look for
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
33 mistakes in it and fix them for us (:-).
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
34 */
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
35
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
36 /* The following constants are machine-specific. MD{MIN,MAX}EXPT are
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
37 integers and MD{MIN,MAX}FRAC are strings such that
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
38 0.${MDMAXFRAC}e${MDMAXEXPT} is the largest representable double,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
39 0.${MDMINFRAC}e${MDMINEXPT} is the smallest representable +ve double
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
40 MD{MIN,MAX}FRAC must not have any trailing zeros.
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
41 The values here are for IEEE-754 64-bit floats.
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
42 It is not perfectly clear to me whether an IEEE infinity should be
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
43 returned for overflow, nor what a portable way of writing one is,
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
44 so HUGE is just 0.MAXFRAC*10**MAXEXPT (this seems still to be the
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
45 UNIX convention).
548
83046664160e Clear errno, just to be sure.
Guido van Rossum <guido@python.org>
parents: 514
diff changeset
46
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
47 I do know about <values.h>, but the whole point of this file is that
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
48 we can't always trust that stuff to be there or to be correct.
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
49 */
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
50 static int MDMINEXPT = -323;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
51 static char MDMINFRAC[] = "494065645841246544";
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
52 static double ZERO = 0.0;
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
53
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
54 static int MDMAXEXPT = 309;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
55 static char MDMAXFRAC[] = "17976931348623157";
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
56 static double HUGE = 1.7976931348623157e308;
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
57
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
58 extern double atof(const char *); /* Only called when result known to be ok */
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
59
38716
42808526511c Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 18835
diff changeset
60 #ifdef HAVE_ERRNO_H
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
61 #include <errno.h>
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 4043
diff changeset
62 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
63 extern int errno;
208
f352ea4dff70 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
65 double strtod(char *str, char **ptr)
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
66 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
67 int sign, scale, dotseen;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
68 int esign, expt;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
69 char *save;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
70 register char *sp, *dp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
71 register int c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
72 char *buforg, *buflim;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
73 char buffer[64]; /* 45-digit significant + */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
74 /* 13-digit exponent */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
75 sp = str;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
76 while (*sp == ' ') sp++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
77 sign = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
78 if (*sp == '-') sign -= 2, sp++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
79 dotseen = 0, scale = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
80 dp = buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
81 *dp++ = '0'; *dp++ = '.';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
82 buforg = dp, buflim = buffer+48;
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61275
diff changeset
83 for (save = sp; (c = *sp); sp++)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
84 if (c == '.') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
85 if (dotseen) break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
86 dotseen++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
87 } else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
88 if ((unsigned)(c-'0') > (unsigned)('9'-'0')) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
89 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
90 } else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
91 if (c == '0') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
92 if (dp != buforg) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
93 /* This is not the first digit, so we want to keep it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
94 if (dp < buflim) *dp++ = c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
95 if (!dotseen) scale++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
96 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
97 /* No non-zero digits seen yet */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
98 /* If a . has been seen, scale must be adjusted */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
99 if (dotseen) scale--;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
100 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
101 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
102 /* This is a nonzero digit, so we want to keep it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
103 if (dp < buflim) *dp++ = c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
104 /* If it precedes a ., scale must be adjusted */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
105 if (!dotseen) scale++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
106 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
107 if (sp == save) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
108 if (ptr) *ptr = str;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
109 errno = EDOM; /* what should this be? */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
110 return ZERO;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
111 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
112
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
113 while (dp > buforg && dp[-1] == '0') --dp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
114 if (dp == buforg) *dp++ = '0';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
115 *dp = '\0';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
116 /* Now the contents of buffer are
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
117 +--+--------+-+--------+
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
118 |0.|fraction|\|leftover|
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
119 +--+--------+-+--------+
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
120 ^dp points here
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
121 where fraction begins with 0 iff it is "0", and has at most
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
122 45 digits in it, and leftover is at least 16 characters.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
123 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
124 save = sp, expt = 0, esign = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
125 do {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
126 c = *sp++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
127 if (c != 'e' && c != 'E') break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
128 c = *sp++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
129 if (c == '-') esign -= 2, c = *sp++; else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
130 if (c == '+' /* || c == ' ' */ ) c = *sp++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
131 if ((unsigned)(c-'0') > (unsigned)('9'-'0')) break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
132 while (c == '0') c = *sp++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
133 for (; (unsigned)(c-'0') <= (unsigned)('9'-'0'); c = *sp++)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
134 expt = expt*10 + c-'0';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
135 if (esign < 0) expt = -expt;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
136 save = sp-1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
137 } while (0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
138 if (ptr) *ptr = save;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
139 expt += scale;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
140 /* Now the number is sign*0.fraction*10**expt */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
141 errno = ERANGE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
142 if (expt > MDMAXEXPT) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
143 return HUGE*sign;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
144 } else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
145 if (expt == MDMAXEXPT) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
146 if (strcmp(buforg, MDMAXFRAC) > 0) return HUGE*sign;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
147 } else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
148 if (expt < MDMINEXPT) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
149 return ZERO*sign;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
150 } else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
151 if (expt == MDMINEXPT) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
152 if (strcmp(buforg, MDMINFRAC) < 0) return ZERO*sign;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
153 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
154 /* We have now established that the number can be */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
155 /* represented without overflow or underflow */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
156 (void) sprintf(dp, "E%d", expt);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
157 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45214
diff changeset
158 return atof(buffer)*sign;
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
159 }