Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 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 | 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 | 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 } |
