annotate Python/strtod.c @ 43292:876b7ef4775d

Merged revisions 57778-58052 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r57820 | georg.brandl | 2007-08-31 08:59:27 +0200 (Fri, 31 Aug 2007) | 2 lines Document new shorthand notation for index entries. ........ r57827 | georg.brandl | 2007-08-31 10:47:51 +0200 (Fri, 31 Aug 2007) | 2 lines Fix subitem markup. ........ r57833 | martin.v.loewis | 2007-08-31 12:01:07 +0200 (Fri, 31 Aug 2007) | 1 line Mark registry components as 64-bit on Win64. ........ r57854 | bill.janssen | 2007-08-31 21:02:23 +0200 (Fri, 31 Aug 2007) | 1 line deprecate use of FakeSocket ........ r57855 | bill.janssen | 2007-08-31 21:02:46 +0200 (Fri, 31 Aug 2007) | 1 line remove mentions of socket.ssl in comments ........ r57856 | bill.janssen | 2007-08-31 21:03:31 +0200 (Fri, 31 Aug 2007) | 1 line remove use of non-existent SSLFakeSocket in apparently untested code ........ r57859 | martin.v.loewis | 2007-09-01 08:36:03 +0200 (Sat, 01 Sep 2007) | 3 lines Bug #1737210: Change Manufacturer of Windows installer to PSF. Will backport to 2.5. ........ r57865 | georg.brandl | 2007-09-01 09:51:24 +0200 (Sat, 01 Sep 2007) | 2 lines Fix RST link (backport from Py3k). ........ r57876 | georg.brandl | 2007-09-01 17:49:49 +0200 (Sat, 01 Sep 2007) | 2 lines Document sets' ">" and "<" operations (backport from py3k). ........ r57878 | skip.montanaro | 2007-09-01 19:40:03 +0200 (Sat, 01 Sep 2007) | 4 lines Added a note and examples to explain that re.split does not split on an empty pattern match. (issue 852532). ........ r57879 | walter.doerwald | 2007-09-01 20:18:09 +0200 (Sat, 01 Sep 2007) | 2 lines Fix wrong function names. ........ r57880 | walter.doerwald | 2007-09-01 20:34:05 +0200 (Sat, 01 Sep 2007) | 2 lines Fix typo. ........ r57889 | andrew.kuchling | 2007-09-01 22:31:59 +0200 (Sat, 01 Sep 2007) | 1 line Markup fix ........ r57892 | andrew.kuchling | 2007-09-01 22:43:36 +0200 (Sat, 01 Sep 2007) | 1 line Add various items ........ r57895 | andrew.kuchling | 2007-09-01 23:17:58 +0200 (Sat, 01 Sep 2007) | 1 line Wording change ........ r57896 | andrew.kuchling | 2007-09-01 23:18:31 +0200 (Sat, 01 Sep 2007) | 1 line Add more items ........ r57904 | ronald.oussoren | 2007-09-02 11:46:07 +0200 (Sun, 02 Sep 2007) | 3 lines Macosx: this patch ensures that the value of MACOSX_DEPLOYMENT_TARGET used by the Makefile is also used at configure-time. ........ r57925 | georg.brandl | 2007-09-03 09:16:46 +0200 (Mon, 03 Sep 2007) | 2 lines Fix #883466: don't allow Unicode as arguments to quopri and uu codecs. ........ r57936 | matthias.klose | 2007-09-04 01:33:04 +0200 (Tue, 04 Sep 2007) | 2 lines - Added support for linking the bsddb module against BerkeleyDB 4.6.x. ........ r57954 | mark.summerfield | 2007-09-04 10:16:15 +0200 (Tue, 04 Sep 2007) | 3 lines Added cross-references plus a note about dict & list shallow copying. ........ r57958 | martin.v.loewis | 2007-09-04 11:51:57 +0200 (Tue, 04 Sep 2007) | 3 lines Document that we rely on the OS to release the crypto context. Fixes #1626801. ........ r57960 | martin.v.loewis | 2007-09-04 15:13:14 +0200 (Tue, 04 Sep 2007) | 3 lines Patch #1388440: Add set_completion_display_matches_hook and get_completion_type to readline. ........ r57961 | martin.v.loewis | 2007-09-04 16:19:28 +0200 (Tue, 04 Sep 2007) | 3 lines Patch #1031213: Decode source line in SyntaxErrors back to its original source encoding. Will backport to 2.5. ........ r57972 | matthias.klose | 2007-09-04 20:17:36 +0200 (Tue, 04 Sep 2007) | 3 lines - Makefile.pre.in(buildbottest): Run an optional script pybuildbot.identify to include some information about the build environment. ........ r57973 | matthias.klose | 2007-09-04 21:05:38 +0200 (Tue, 04 Sep 2007) | 2 lines - Makefile.pre.in(buildbottest): Remove whitespace at eol. ........ r57975 | matthias.klose | 2007-09-04 22:46:02 +0200 (Tue, 04 Sep 2007) | 2 lines - Fix libffi configure for hppa*-*-linux* | parisc*-*-linux*. ........ r57980 | bill.janssen | 2007-09-05 02:46:27 +0200 (Wed, 05 Sep 2007) | 1 line SSL certificate distinguished names should be represented by tuples ........ r57985 | martin.v.loewis | 2007-09-05 08:39:17 +0200 (Wed, 05 Sep 2007) | 3 lines Patch #1105: Explain that one needs to build the solution to get dependencies right. ........ r57987 | armin.rigo | 2007-09-05 09:51:21 +0200 (Wed, 05 Sep 2007) | 4 lines PyDict_GetItem() returns a borrowed reference. There are probably a number of places that are open to attacks such as the following one, in bltinmodule.c:min_max(). ........ r57991 | martin.v.loewis | 2007-09-05 13:47:34 +0200 (Wed, 05 Sep 2007) | 3 lines Patch #786737: Allow building in a tree of symlinks pointing to a readonly source. ........ r57993 | georg.brandl | 2007-09-05 15:36:44 +0200 (Wed, 05 Sep 2007) | 2 lines Backport from Py3k: Bug #1684991: explain lookup semantics for __special__ methods (new-style classes only). ........ r58004 | armin.rigo | 2007-09-06 10:30:51 +0200 (Thu, 06 Sep 2007) | 4 lines Patch #1733973 by peaker: ptrace_enter_call() assumes no exception is currently set. This assumption is broken when throwing into a generator. ........ r58006 | armin.rigo | 2007-09-06 11:30:38 +0200 (Thu, 06 Sep 2007) | 4 lines PyDict_GetItem() returns a borrowed reference. This attack is against ceval.c:IMPORT_NAME, which calls an object (__builtin__.__import__) without holding a reference to it. ........ r58013 | georg.brandl | 2007-09-06 16:49:56 +0200 (Thu, 06 Sep 2007) | 2 lines Backport from 3k: #1116: fix reference to old filename. ........ r58021 | thomas.heller | 2007-09-06 22:26:20 +0200 (Thu, 06 Sep 2007) | 1 line Fix typo: c_float represents to C float type. ........ r58022 | skip.montanaro | 2007-09-07 00:29:06 +0200 (Fri, 07 Sep 2007) | 3 lines If this is correct for py3k branch and it's already in the release25-maint branch, seems like it ought to be on the trunk as well. ........ r58023 | gregory.p.smith | 2007-09-07 00:59:59 +0200 (Fri, 07 Sep 2007) | 4 lines Apply the fix from Issue1112 to make this test more robust and keep windows happy. ........ r58031 | brett.cannon | 2007-09-07 05:17:50 +0200 (Fri, 07 Sep 2007) | 4 lines Make uuid1 and uuid4 tests conditional on whether ctypes can be imported; implementation of either function depends on ctypes but uuid as a whole does not. ........ r58032 | brett.cannon | 2007-09-07 06:18:30 +0200 (Fri, 07 Sep 2007) | 6 lines Fix a crasher where Python code managed to infinitely recurse in C code without ever going back out to Python code in PyObject_Call(). Required introducing a static RuntimeError instance so that normalizing an exception there is no reliance on a recursive call that would put the exception system over the recursion check itself. ........ r58034 | thomas.heller | 2007-09-07 08:32:17 +0200 (Fri, 07 Sep 2007) | 1 line Add a 'c_longdouble' type to the ctypes module. ........ r58035 | thomas.heller | 2007-09-07 11:30:40 +0200 (Fri, 07 Sep 2007) | 1 line Remove unneeded #include. ........ r58036 | thomas.heller | 2007-09-07 11:33:24 +0200 (Fri, 07 Sep 2007) | 6 lines Backport from py3k branch: Add a workaround for a strange bug on win64, when _ctypes is compiled with the SDK compiler. This should fix the failing Lib\ctypes\test\test_as_parameter.py test. ........ r58037 | georg.brandl | 2007-09-07 16:14:40 +0200 (Fri, 07 Sep 2007) | 2 lines Fix a wrong indentation for sublists. ........ r58043 | georg.brandl | 2007-09-07 22:10:49 +0200 (Fri, 07 Sep 2007) | 2 lines #1095: ln -f doesn't work portably, fix in Makefile. ........ r58049 | skip.montanaro | 2007-09-08 02:34:17 +0200 (Sat, 08 Sep 2007) | 1 line be explicit about the actual location of the missing file ........
author Thomas Wouters <thomas@python.org>
date Sat, 08 Sep 2007 17:39:28 +0000
parents 654c380cf8b9
children e82ab2423aab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
1 #include "pyconfig.h"
2396
29ca45eb3ab7 for __SC__
Guido van Rossum <guido@python.org>
parents: 749
diff changeset
2
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
3 /* 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
4 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
5
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
6 ************************************************************
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
7 * YOU MUST EDIT THE MACHINE-DEPENDENT DEFINITIONS BELOW!!! *
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
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
11 /* File : stdtod.c (Modified version of str2dbl.c)
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
12 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
13 Updated: Tuesday August 2nd, 1988
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
14 Defines: double strtod (char *str, char**ptr)
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
15 */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
16
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
17 /* This is an implementation of the strtod() function described in the
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
18 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
19 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
20 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
21 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
22
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
23 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
24 (a) some UNIX systems do not yet have strtod(), or do not have it
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
25 available in the BSD "universe" (but they do have atof()).
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
26 (b) some of the UNIX systems that *do* have it get it wrong.
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
27 (some crash with large arguments, some assign the wrong *ptr value).
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
28 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
29 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
30 mistakes in it and fix them for us (:-).
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
31 */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
32
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
33 /* 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
34 integers and MD{MIN,MAX}FRAC are strings such that
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
35 0.${MDMAXFRAC}e${MDMAXEXPT} is the largest representable double,
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
36 0.${MDMINFRAC}e${MDMINEXPT} is the smallest representable +ve double
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
37 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
38 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
39 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
40 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
41 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
42 UNIX convention).
548
83046664160e Clear errno, just to be sure.
Guido van Rossum <guido@python.org>
parents: 514
diff changeset
43
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
44 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
45 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
46 */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
47 static int MDMINEXPT = {-323};
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
48 static char MDMINFRAC[] = "494065645841246544";
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
49 static double ZERO = 0.0;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
50
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
51 static int MDMAXEXPT = { 309};
749
32085edd77a7 fix HUGE and MAXVAL (suggested by Tim Peters)
Guido van Rossum <guido@python.org>
parents: 595
diff changeset
52 static char MDMAXFRAC[] = "17976931348623157";
32085edd77a7 fix HUGE and MAXVAL (suggested by Tim Peters)
Guido van Rossum <guido@python.org>
parents: 595
diff changeset
53 static double HUGE = 1.7976931348623157e308;
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
54
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
55 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
56
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 18835
diff changeset
57 #ifdef HAVE_ERRNO_H
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
58 #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
59 #endif
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
60 extern int errno;
208
f352ea4dff70 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
62 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
63 {
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
64 int sign, scale, dotseen;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
65 int esign, expt;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
66 char *save;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
67 register char *sp, *dp;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
68 register int c;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
69 char *buforg, *buflim;
13620
5b727ab37092 Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents: 10530
diff changeset
70 char buffer[64]; /* 45-digit significant + */
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
71 /* 13-digit exponent */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
72 sp = str;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
73 while (*sp == ' ') sp++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
74 sign = 1;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
75 if (*sp == '-') sign -= 2, sp++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
76 dotseen = 0, scale = 0;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
77 dp = buffer;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
78 *dp++ = '0'; *dp++ = '.';
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
79 buforg = dp, buflim = buffer+48;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
80 for (save = sp; c = *sp; sp++)
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
81 if (c == '.') {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
82 if (dotseen) break;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
83 dotseen++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
84 } else
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
85 if ((unsigned)(c-'0') > (unsigned)('9'-'0')) {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
86 break;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
87 } else
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
88 if (c == '0') {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
89 if (dp != buforg) {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
90 /* This is not the first digit, so we want to keep it */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
91 if (dp < buflim) *dp++ = c;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
92 if (!dotseen) scale++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
93 } else {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
94 /* No non-zero digits seen yet */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
95 /* If a . has been seen, scale must be adjusted */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
96 if (dotseen) scale--;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
97 }
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
98 } else {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
99 /* This is a nonzero digit, so we want to keep it */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
100 if (dp < buflim) *dp++ = c;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
101 /* If it precedes a ., scale must be adjusted */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
102 if (!dotseen) scale++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
103 }
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
104 if (sp == save) {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
105 if (ptr) *ptr = str;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
106 errno = EDOM; /* what should this be? */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
107 return ZERO;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
108 }
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
109
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
110 while (dp > buforg && dp[-1] == '0') --dp;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
111 if (dp == buforg) *dp++ = '0';
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
112 *dp = '\0';
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
113 /* Now the contents of buffer are
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
114 +--+--------+-+--------+
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
115 |0.|fraction|\|leftover|
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
116 +--+--------+-+--------+
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
117 ^dp points here
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
118 where fraction begins with 0 iff it is "0", and has at most
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
119 45 digits in it, and leftover is at least 16 characters.
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
120 */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
121 save = sp, expt = 0, esign = 1;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
122 do {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
123 c = *sp++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
124 if (c != 'e' && c != 'E') break;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
125 c = *sp++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
126 if (c == '-') esign -= 2, c = *sp++; else
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
127 if (c == '+' /* || c == ' ' */ ) c = *sp++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
128 if ((unsigned)(c-'0') > (unsigned)('9'-'0')) break;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
129 while (c == '0') c = *sp++;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
130 for (; (unsigned)(c-'0') <= (unsigned)('9'-'0'); c = *sp++)
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
131 expt = expt*10 + c-'0';
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
132 if (esign < 0) expt = -expt;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
133 save = sp-1;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
134 } while (0);
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
135 if (ptr) *ptr = save;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
136 expt += scale;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
137 /* Now the number is sign*0.fraction*10**expt */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
138 errno = ERANGE;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
139 if (expt > MDMAXEXPT) {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
140 return HUGE*sign;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
141 } else
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
142 if (expt == MDMAXEXPT) {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
143 if (strcmp(buforg, MDMAXFRAC) > 0) return HUGE*sign;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
144 } else
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
145 if (expt < MDMINEXPT) {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
146 return ZERO*sign;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
147 } else
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
148 if (expt == MDMINEXPT) {
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
149 if (strcmp(buforg, MDMINFRAC) < 0) return ZERO*sign;
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
150 }
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
151 /* We have now established that the number can be */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
152 /* represented without overflow or underflow */
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
153 (void) sprintf(dp, "E%d", expt);
548
83046664160e Clear errno, just to be sure.
Guido van Rossum <guido@python.org>
parents: 514
diff changeset
154 errno = 0;
595
f9cdeebfcb67 New version from the net.
Guido van Rossum <guido@python.org>
parents: 548
diff changeset
155 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
156 }