Mercurial > cpython-lru_cache-weakref
annotate Python/pystrtod.c @ 53479:785ea299fe23
Merged revisions 71976 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r71976 | mark.dickinson | 2009-04-26 20:54:55 +0100 (Sun, 26 Apr 2009) | 2 lines
Fix typo in function name
........
| author | Mark Dickinson <dickinsm@gmail.com> |
|---|---|
| date | Sun, 26 Apr 2009 20:02:24 +0000 |
| parents | f76572108dd7 |
| children | de1d0f71e209 |
| rev | line source |
|---|---|
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
1 /* -*- Mode: C; c-file-style: "python" -*- */ |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
2 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
3 #include <Python.h> |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
4 #include <locale.h> |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
5 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
6 /* ascii character tests (as opposed to locale tests) */ |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
7 #define ISSPACE(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || \ |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
8 (c) == '\r' || (c) == '\t' || (c) == '\v') |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
9 #define ISDIGIT(c) ((c) >= '0' && (c) <= '9') |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
10 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
11 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
12 /** |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
13 * PyOS_ascii_strtod: |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
14 * @nptr: the string to convert to a numeric value. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
15 * @endptr: if non-%NULL, it returns the character after |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
16 * the last character used in the conversion. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
17 * |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
18 * Converts a string to a #gdouble value. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
19 * This function behaves like the standard strtod() function |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
20 * does in the C locale. It does this without actually |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
21 * changing the current locale, since that would not be |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
22 * thread-safe. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
23 * |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
24 * This function is typically used when reading configuration |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
25 * files or other non-user input that should be locale independent. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
26 * To handle input from the user you should normally use the |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
27 * locale-sensitive system strtod() function. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
28 * |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
29 * If the correct value would cause overflow, plus or minus %HUGE_VAL |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
30 * is returned (according to the sign of the value), and %ERANGE is |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
31 * stored in %errno. If the correct value would cause underflow, |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
32 * zero is returned and %ERANGE is stored in %errno. |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
33 * If memory allocation fails, %ENOMEM is stored in %errno. |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
34 * |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
35 * This function resets %errno before calling strtod() so that |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
36 * you can reliably detect overflow and underflow. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
37 * |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
38 * Return value: the #gdouble value. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
39 **/ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
40 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
41 #ifndef PY_NO_SHORT_FLOAT_REPR |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
42 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
43 double |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
44 PyOS_ascii_strtod(const char *nptr, char **endptr) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
45 { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
46 double result; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
47 _Py_SET_53BIT_PRECISION_HEADER; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
48 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
49 assert(nptr != NULL); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
50 /* Set errno to zero, so that we can distinguish zero results |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
51 and underflows */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
52 errno = 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
53 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
54 _Py_SET_53BIT_PRECISION_START; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
55 result = _Py_dg_strtod(nptr, endptr); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
56 _Py_SET_53BIT_PRECISION_END; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
57 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
58 return result; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
59 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
60 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
61 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
62 #else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
63 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
64 /* |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
65 Use system strtod; since strtod is locale aware, we may |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
66 have to first fix the decimal separator. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
67 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
68 Note that unlike _Py_dg_strtod, the system strtod may not always give |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
69 correctly rounded results. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
70 */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
71 |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
72 double |
|
36077
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
73 PyOS_ascii_strtod(const char *nptr, char **endptr) |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
74 { |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
75 char *fail_pos; |
| 36080 | 76 double val = -1.0; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
77 struct lconv *locale_data; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
78 const char *decimal_point; |
|
36230
ded4a497eb76
Fix icc warnings: strlen() returns size_t
Neal Norwitz <nnorwitz@gmail.com>
parents:
36080
diff
changeset
|
79 size_t decimal_point_len; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
80 const char *p, *decimal_point_pos; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
81 const char *end = NULL; /* Silence gcc */ |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
82 const char *digits_pos = NULL; |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
83 int negate = 0; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
84 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
85 assert(nptr != NULL); |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
86 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
87 fail_pos = NULL; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
88 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
89 locale_data = localeconv(); |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
90 decimal_point = locale_data->decimal_point; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
91 decimal_point_len = strlen(decimal_point); |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
92 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
93 assert(decimal_point_len != 0); |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
94 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
95 decimal_point_pos = NULL; |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
96 |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
97 /* Set errno to zero, so that we can distinguish zero results |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
98 and underflows */ |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
99 errno = 0; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
100 |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
101 /* We process any leading whitespace and the optional sign manually, |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
102 then pass the remainder to the system strtod. This ensures that |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
103 the result of an underflow has the correct sign. (bug #1725) */ |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
104 |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
105 p = nptr; |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
106 /* Skip leading space */ |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
107 while (ISSPACE(*p)) |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
108 p++; |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
109 |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
110 /* Process leading sign, if present */ |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
111 if (*p == '-') { |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
112 negate = 1; |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
113 p++; |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
114 } |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
115 else if (*p == '+') { |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
116 p++; |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
117 } |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
118 |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
119 /* Parse infinities and nans */ |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
120 if (*p == 'i' || *p == 'I') { |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
121 if (PyOS_strnicmp(p, "inf", 3) == 0) { |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
122 val = Py_HUGE_VAL; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
123 if (PyOS_strnicmp(p+3, "inity", 5) == 0) |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
124 fail_pos = (char *)p+8; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
125 else |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
126 fail_pos = (char *)p+3; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
127 goto got_val; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
128 } |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
129 else |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
130 goto invalid_string; |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
131 } |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
132 #ifdef Py_NAN |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
133 if (*p == 'n' || *p == 'N') { |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
134 if (PyOS_strnicmp(p, "nan", 3) == 0) { |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
135 val = Py_NAN; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
136 fail_pos = (char *)p+3; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
137 goto got_val; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
138 } |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
139 else |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
140 goto invalid_string; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
141 } |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
142 #endif |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
143 |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
144 /* Some platform strtods accept hex floats; Python shouldn't (at the |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
145 moment), so we check explicitly for strings starting with '0x'. */ |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
146 if (*p == '0' && (*(p+1) == 'x' || *(p+1) == 'X')) |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
147 goto invalid_string; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
148 |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
149 /* Check that what's left begins with a digit or decimal point */ |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
150 if (!ISDIGIT(*p) && *p != '.') |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
151 goto invalid_string; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
152 |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
153 digits_pos = p; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
154 if (decimal_point[0] != '.' || |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
155 decimal_point[1] != 0) |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
156 { |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
157 /* Look for a '.' in the input; if present, it'll need to be |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
158 swapped for the current locale's decimal point before we |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
159 call strtod. On the other hand, if we find the current |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
160 locale's decimal point then the input is invalid. */ |
|
36077
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
161 while (ISDIGIT(*p)) |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
162 p++; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
163 |
|
36077
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
164 if (*p == '.') |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
165 { |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
166 decimal_point_pos = p++; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
167 |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
168 /* locate end of number */ |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
169 while (ISDIGIT(*p)) |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
170 p++; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
171 |
|
36077
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
172 if (*p == 'e' || *p == 'E') |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
173 p++; |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
174 if (*p == '+' || *p == '-') |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
175 p++; |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
176 while (ISDIGIT(*p)) |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
177 p++; |
|
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
178 end = p; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
179 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
180 else if (strncmp(p, decimal_point, decimal_point_len) == 0) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
181 /* Python bug #1417699 */ |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
182 goto invalid_string; |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
183 /* For the other cases, we need not convert the decimal |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
184 point */ |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
185 } |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
186 |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
187 if (decimal_point_pos) { |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
188 char *copy, *c; |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
189 /* Create a copy of the input, with the '.' converted to the |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
190 locale-specific decimal point */ |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
191 copy = (char *)PyMem_MALLOC(end - digits_pos + |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
192 1 + decimal_point_len); |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
193 if (copy == NULL) { |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
194 if (endptr) |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
195 *endptr = (char *)nptr; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
196 errno = ENOMEM; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
197 return val; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
198 } |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
199 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
200 c = copy; |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
201 memcpy(c, digits_pos, decimal_point_pos - digits_pos); |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
202 c += decimal_point_pos - digits_pos; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
203 memcpy(c, decimal_point, decimal_point_len); |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
204 c += decimal_point_len; |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
205 memcpy(c, decimal_point_pos + 1, |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
206 end - (decimal_point_pos + 1)); |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
207 c += end - (decimal_point_pos + 1); |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
208 *c = 0; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
209 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
210 val = strtod(copy, &fail_pos); |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
211 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
212 if (fail_pos) |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
213 { |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
214 if (fail_pos > decimal_point_pos) |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
215 fail_pos = (char *)digits_pos + |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
216 (fail_pos - copy) - |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
217 (decimal_point_len - 1); |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
218 else |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
219 fail_pos = (char *)digits_pos + |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
220 (fail_pos - copy); |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
221 } |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
222 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
223 PyMem_FREE(copy); |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
224 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
225 } |
|
36077
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
226 else { |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
227 val = strtod(digits_pos, &fail_pos); |
|
36077
3b90258fec9f
Get float() to be more portable across platforms. Disable hex strings.
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
228 } |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
229 |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
230 if (fail_pos == digits_pos) |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
231 goto invalid_string; |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
232 |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
233 got_val: |
|
44535
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
234 if (negate && fail_pos != nptr) |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
235 val = -val; |
|
420fe6d7d5f4
Merged revisions 59703-59773 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
39442
diff
changeset
|
236 |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
237 if (endptr) |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
238 *endptr = fail_pos; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
239 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
240 return val; |
|
53468
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
241 |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
242 invalid_string: |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
243 if (endptr) |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
244 *endptr = (char*)nptr; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
245 errno = EINVAL; |
|
f76572108dd7
Internal plumbing changes for float parsing:
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
246 return -1.0; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
247 } |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
248 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
249 #endif |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
250 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
251 double |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
252 PyOS_ascii_atof(const char *nptr) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
253 { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
254 return PyOS_ascii_strtod(nptr, NULL); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
255 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
256 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
257 |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
258 /* Given a string that may have a decimal point in the current |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
259 locale, change it back to a dot. Since the string cannot get |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
260 longer, no need for a maximum buffer size parameter. */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
261 Py_LOCAL_INLINE(void) |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
262 change_decimal_from_locale_to_dot(char* buffer) |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
263 { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
264 struct lconv *locale_data = localeconv(); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
265 const char *decimal_point = locale_data->decimal_point; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
266 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
267 if (decimal_point[0] != '.' || decimal_point[1] != 0) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
268 size_t decimal_point_len = strlen(decimal_point); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
269 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
270 if (*buffer == '+' || *buffer == '-') |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
271 buffer++; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
272 while (isdigit(Py_CHARMASK(*buffer))) |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
273 buffer++; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
274 if (strncmp(buffer, decimal_point, decimal_point_len) == 0) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
275 *buffer = '.'; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
276 buffer++; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
277 if (decimal_point_len > 1) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
278 /* buffer needs to get smaller */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
279 size_t rest_len = strlen(buffer + |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
280 (decimal_point_len - 1)); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
281 memmove(buffer, |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
282 buffer + (decimal_point_len - 1), |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
283 rest_len); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
284 buffer[rest_len] = 0; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
285 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
286 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
287 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
288 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
289 |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
290 |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
291 /* From the C99 standard, section 7.19.6: |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
292 The exponent always contains at least two digits, and only as many more digits |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
293 as necessary to represent the exponent. |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
294 */ |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
295 #define MIN_EXPONENT_DIGITS 2 |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
296 |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
297 /* Ensure that any exponent, if present, is at least MIN_EXPONENT_DIGITS |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
298 in length. */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
299 Py_LOCAL_INLINE(void) |
|
53479
785ea299fe23
Merged revisions 71976 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53468
diff
changeset
|
300 ensure_minimum_exponent_length(char* buffer, size_t buf_size) |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
301 { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
302 char *p = strpbrk(buffer, "eE"); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
303 if (p && (*(p + 1) == '-' || *(p + 1) == '+')) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
304 char *start = p + 2; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
305 int exponent_digit_cnt = 0; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
306 int leading_zero_cnt = 0; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
307 int in_leading_zeros = 1; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
308 int significant_digit_cnt; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
309 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
310 /* Skip over the exponent and the sign. */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
311 p += 2; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
312 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
313 /* Find the end of the exponent, keeping track of leading |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
314 zeros. */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
315 while (*p && isdigit(Py_CHARMASK(*p))) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
316 if (in_leading_zeros && *p == '0') |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
317 ++leading_zero_cnt; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
318 if (*p != '0') |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
319 in_leading_zeros = 0; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
320 ++p; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
321 ++exponent_digit_cnt; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
322 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
323 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
324 significant_digit_cnt = exponent_digit_cnt - leading_zero_cnt; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
325 if (exponent_digit_cnt == MIN_EXPONENT_DIGITS) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
326 /* If there are 2 exactly digits, we're done, |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
327 regardless of what they contain */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
328 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
329 else if (exponent_digit_cnt > MIN_EXPONENT_DIGITS) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
330 int extra_zeros_cnt; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
331 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
332 /* There are more than 2 digits in the exponent. See |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
333 if we can delete some of the leading zeros */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
334 if (significant_digit_cnt < MIN_EXPONENT_DIGITS) |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
335 significant_digit_cnt = MIN_EXPONENT_DIGITS; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
336 extra_zeros_cnt = exponent_digit_cnt - |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
337 significant_digit_cnt; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
338 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
339 /* Delete extra_zeros_cnt worth of characters from the |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
340 front of the exponent */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
341 assert(extra_zeros_cnt >= 0); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
342 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
343 /* Add one to significant_digit_cnt to copy the |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
344 trailing 0 byte, thus setting the length */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
345 memmove(start, |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
346 start + extra_zeros_cnt, |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
347 significant_digit_cnt + 1); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
348 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
349 else { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
350 /* If there are fewer than 2 digits, add zeros |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
351 until there are 2, if there's enough room */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
352 int zeros = MIN_EXPONENT_DIGITS - exponent_digit_cnt; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
353 if (start + zeros + exponent_digit_cnt + 1 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
354 < buffer + buf_size) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
355 memmove(start + zeros, start, |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
356 exponent_digit_cnt + 1); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
357 memset(start, '0', zeros); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
358 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
359 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
360 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
361 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
362 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
363 /* Ensure that buffer has a decimal point in it. The decimal point will not |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
364 be in the current locale, it will always be '.'. Don't add a decimal if an |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
365 exponent is present. */ |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
366 Py_LOCAL_INLINE(void) |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
367 ensure_decimal_point(char* buffer, size_t buf_size) |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
368 { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
369 int insert_count = 0; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
370 char* chars_to_insert; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
371 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
372 /* search for the first non-digit character */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
373 char *p = buffer; |
|
48537
48e83e66935a
Merged revisions 65125 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48358
diff
changeset
|
374 if (*p == '-' || *p == '+') |
|
48e83e66935a
Merged revisions 65125 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48358
diff
changeset
|
375 /* Skip leading sign, if present. I think this could only |
|
48e83e66935a
Merged revisions 65125 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48358
diff
changeset
|
376 ever be '-', but it can't hurt to check for both. */ |
|
48e83e66935a
Merged revisions 65125 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48358
diff
changeset
|
377 ++p; |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
378 while (*p && isdigit(Py_CHARMASK(*p))) |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
379 ++p; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
380 |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
381 if (*p == '.') { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
382 if (isdigit(Py_CHARMASK(*(p+1)))) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
383 /* Nothing to do, we already have a decimal |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
384 point and a digit after it */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
385 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
386 else { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
387 /* We have a decimal point, but no following |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
388 digit. Insert a zero after the decimal. */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
389 ++p; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
390 chars_to_insert = "0"; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
391 insert_count = 1; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
392 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
393 } |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
394 else if (!(*p == 'e' || *p == 'E')) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
395 /* Don't add ".0" if we have an exponent. */ |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
396 chars_to_insert = ".0"; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
397 insert_count = 2; |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
398 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
399 if (insert_count) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
400 size_t buf_len = strlen(buffer); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
401 if (buf_len + insert_count + 1 >= buf_size) { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
402 /* If there is not enough room in the buffer |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
403 for the additional text, just skip it. It's |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
404 not worth generating an error over. */ |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
405 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
406 else { |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
407 memmove(p + insert_count, p, |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
408 buffer + strlen(buffer) - p + 1); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
409 memcpy(p, chars_to_insert, insert_count); |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
410 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
411 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
412 } |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
413 |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
414 /* see FORMATBUFLEN in unicodeobject.c */ |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
415 #define FLOAT_FORMATBUFLEN 120 |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
416 |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
417 /** |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
418 * PyOS_ascii_formatd: |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
419 * @buffer: A buffer to place the resulting string in |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
420 * @buf_size: The length of the buffer. |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
421 * @format: The printf()-style format to use for the |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
422 * code to use for converting. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
423 * @d: The #gdouble to convert |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
424 * |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
425 * Converts a #gdouble to a string, using the '.' as |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
426 * decimal point. To format the number you pass in |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
427 * a printf()-style format string. Allowed conversion |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
428 * specifiers are 'e', 'E', 'f', 'F', 'g', 'G', and 'Z'. |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
429 * |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
430 * 'Z' is the same as 'g', except it always has a decimal and |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
431 * at least one digit after the decimal. |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
432 * |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
433 * Return value: The pointer to the buffer with the converted string. |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
434 **/ |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
435 char * |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
436 PyOS_ascii_formatd(char *buffer, |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
437 size_t buf_size, |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
438 const char *format, |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
439 double d) |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
440 { |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
441 char format_char; |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
442 size_t format_len = strlen(format); |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
443 |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
444 /* Issue 2264: code 'Z' requires copying the format. 'Z' is 'g', but |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
445 also with at least one character past the decimal. */ |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
446 char tmp_format[FLOAT_FORMATBUFLEN]; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
447 |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
448 /* The last character in the format string must be the format char */ |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
449 format_char = format[format_len - 1]; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
450 |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
451 if (format[0] != '%') |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
452 return NULL; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
453 |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
454 /* I'm not sure why this test is here. It's ensuring that the format |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
455 string after the first character doesn't have a single quote, a |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
456 lowercase l, or a percent. This is the reverse of the commented-out |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
457 test about 10 lines ago. */ |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
458 if (strpbrk(format + 1, "'l%")) |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
459 return NULL; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
460 |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
461 /* Also curious about this function is that it accepts format strings |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
462 like "%xg", which are invalid for floats. In general, the |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
463 interface to this function is not very good, but changing it is |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
464 difficult because it's a public API. */ |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
465 |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
466 if (!(format_char == 'e' || format_char == 'E' || |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
467 format_char == 'f' || format_char == 'F' || |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
468 format_char == 'g' || format_char == 'G' || |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
469 format_char == 'Z')) |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
470 return NULL; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
471 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
472 /* Map 'Z' format_char to 'g', by copying the format string and |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
473 replacing the final char with a 'g' */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
474 if (format_char == 'Z') { |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
475 if (format_len + 1 >= sizeof(tmp_format)) { |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
476 /* The format won't fit in our copy. Error out. In |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
477 practice, this will never happen and will be |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
478 detected by returning NULL */ |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
479 return NULL; |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
480 } |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
481 strcpy(tmp_format, format); |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
482 tmp_format[format_len - 1] = 'g'; |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
483 format = tmp_format; |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
484 } |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
485 |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
486 |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
487 /* Have PyOS_snprintf do the hard work */ |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
488 PyOS_snprintf(buffer, buf_size, format, d); |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
489 |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
490 /* Do various fixups on the return string */ |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
491 |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
492 /* Get the current locale, and find the decimal point string. |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
493 Convert that string back to a dot. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
494 change_decimal_from_locale_to_dot(buffer); |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
495 |
|
45435
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
496 /* If an exponent exists, ensure that the exponent is at least |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
497 MIN_EXPONENT_DIGITS digits, providing the buffer is large enough |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
498 for the extra zeros. Also, if there are more than |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
499 MIN_EXPONENT_DIGITS, remove as many zeros as possible until we get |
|
42b3b117391d
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900-60931,60933-60958 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44535
diff
changeset
|
500 back to MIN_EXPONENT_DIGITS */ |
|
53479
785ea299fe23
Merged revisions 71976 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53468
diff
changeset
|
501 ensure_minimum_exponent_length(buffer, buf_size); |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
502 |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
503 /* If format_char is 'Z', make sure we have at least one character |
|
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
504 after the decimal point (and make sure we have a decimal point). */ |
|
46601
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
505 if (format_char == 'Z') |
|
7b4081bec783
Merged revisions 62586 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
45852
diff
changeset
|
506 ensure_decimal_point(buffer, buf_size); |
|
45852
30c4e1ca8421
Merged revisions 61431,61433-61436,61439,61444,61449-61450,61453,61458,61465,61468,61471-61474,61480,61483-61484,61488,61495-61496,61498,61503-61504,61507,61509-61510,61515-61518 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45435
diff
changeset
|
507 |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
508 return buffer; |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
509 } |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
510 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
511 #ifdef PY_NO_SHORT_FLOAT_REPR |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
512 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
513 /* The fallback code to use if _Py_dg_dtoa is not available. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
514 |
|
53210
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
515 /* Remove trailing zeros after the decimal point from a numeric string; also |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
516 remove the decimal point if all digits following it are zero. The numeric |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
517 string must end in '\0', and should not have any leading or trailing |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
518 whitespace. Assumes that the decimal point is '.'. */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
519 Py_LOCAL_INLINE(void) |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
520 remove_trailing_zeros(char *buffer) |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
521 { |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
522 char *old_fraction_end, *new_fraction_end, *end, *p; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
523 |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
524 p = buffer; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
525 if (*p == '-' || *p == '+') |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
526 /* Skip leading sign, if present */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
527 ++p; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
528 while (isdigit(Py_CHARMASK(*p))) |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
529 ++p; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
530 |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
531 /* if there's no decimal point there's nothing to do */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
532 if (*p++ != '.') |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
533 return; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
534 |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
535 /* scan any digits after the point */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
536 while (isdigit(Py_CHARMASK(*p))) |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
537 ++p; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
538 old_fraction_end = p; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
539 |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
540 /* scan up to ending '\0' */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
541 while (*p != '\0') |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
542 p++; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
543 /* +1 to make sure that we move the null byte as well */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
544 end = p+1; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
545 |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
546 /* scan back from fraction_end, looking for removable zeros */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
547 p = old_fraction_end; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
548 while (*(p-1) == '0') |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
549 --p; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
550 /* and remove point if we've got that far */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
551 if (*(p-1) == '.') |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
552 --p; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
553 new_fraction_end = p; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
554 |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
555 memmove(new_fraction_end, old_fraction_end, end-old_fraction_end); |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
556 } |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
557 |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
558 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
559 PyAPI_FUNC(char *) PyOS_double_to_string(double val, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
560 char format_code, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
561 int precision, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
562 int flags, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
563 int *type) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
564 { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
565 char buf[128]; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
566 char format[32]; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
567 Py_ssize_t len; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
568 char *result; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
569 char *p; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
570 int t; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
571 int upper = 0; |
|
53210
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
572 int strip_trailing_zeros = 0; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
573 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
574 /* Validate format_code, and map upper and lower case */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
575 switch (format_code) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
576 case 'e': /* exponent */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
577 case 'f': /* fixed */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
578 case 'g': /* general */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
579 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
580 case 'E': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
581 upper = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
582 format_code = 'e'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
583 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
584 case 'F': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
585 upper = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
586 format_code = 'f'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
587 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
588 case 'G': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
589 upper = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
590 format_code = 'g'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
591 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
592 case 'r': /* repr format */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
593 /* Supplied precision is unused, must be 0. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
594 if (precision != 0) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
595 PyErr_BadInternalCall(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
596 return NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
597 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
598 precision = 17; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
599 format_code = 'g'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
600 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
601 case 's': /* str format */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
602 /* Supplied precision is unused, must be 0. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
603 if (precision != 0) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
604 PyErr_BadInternalCall(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
605 return NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
606 } |
|
53210
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
607 /* switch to exponential notation at 1e11, or 1e12 if we're |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
608 not adding a .0 */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
609 if (fabs(val) >= (flags & Py_DTSF_ADD_DOT_0 ? 1e11 : 1e12)) { |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
610 precision = 11; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
611 format_code = 'e'; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
612 strip_trailing_zeros = 1; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
613 } |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
614 else { |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
615 precision = 12; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
616 format_code = 'g'; |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
617 } |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
618 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
619 default: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
620 PyErr_BadInternalCall(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
621 return NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
622 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
623 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
624 /* Handle nan and inf. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
625 if (Py_IS_NAN(val)) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
626 strcpy(buf, "nan"); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
627 t = Py_DTST_NAN; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
628 } else if (Py_IS_INFINITY(val)) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
629 if (copysign(1., val) == 1.) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
630 strcpy(buf, "inf"); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
631 else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
632 strcpy(buf, "-inf"); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
633 t = Py_DTST_INFINITE; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
634 } else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
635 t = Py_DTST_FINITE; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
636 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
637 |
|
53210
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
638 if ((flags & Py_DTSF_ADD_DOT_0) && (format_code != 'e')) |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
639 format_code = 'Z'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
640 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
641 PyOS_snprintf(format, 32, "%%%s.%i%c", (flags & Py_DTSF_ALT ? "#" : ""), precision, format_code); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
642 PyOS_ascii_formatd(buf, sizeof(buf), format, val); |
|
53210
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
643 /* remove trailing zeros if necessary */ |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
644 if (strip_trailing_zeros) |
|
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
645 remove_trailing_zeros(buf); |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
646 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
647 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
648 len = strlen(buf); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
649 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
650 /* Add 1 for the trailing 0 byte. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
651 Add 1 because we might need to make room for the sign. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
652 */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
653 result = PyMem_Malloc(len + 2); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
654 if (result == NULL) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
655 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
656 return NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
657 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
658 p = result; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
659 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
660 /* Add sign when requested. It's convenient (esp. when formatting |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
661 complex numbers) to include a sign even for inf and nan. */ |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
662 if (flags & Py_DTSF_SIGN && buf[0] != '-') |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
663 *p++ = '+'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
664 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
665 strcpy(p, buf); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
666 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
667 if (upper) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
668 /* Convert to upper case. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
669 char *p1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
670 for (p1 = p; *p1; p1++) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
671 *p1 = toupper(*p1); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
672 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
673 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
674 if (type) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
675 *type = t; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
676 return result; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
677 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
678 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
679 #else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
680 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
681 /* _Py_dg_dtoa is available. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
682 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
683 /* I'm using a lookup table here so that I don't have to invent a non-locale |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
684 specific way to convert to uppercase */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
685 #define OFS_INF 0 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
686 #define OFS_NAN 1 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
687 #define OFS_E 2 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
688 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
689 /* The lengths of these are known to the code below, so don't change them */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
690 static char *lc_float_strings[] = { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
691 "inf", |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
692 "nan", |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
693 "e", |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
694 }; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
695 static char *uc_float_strings[] = { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
696 "INF", |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
697 "NAN", |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
698 "E", |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
699 }; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
700 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
701 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
702 /* Convert a double d to a string, and return a PyMem_Malloc'd block of |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
703 memory contain the resulting string. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
704 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
705 Arguments: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
706 d is the double to be converted |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
707 format_code is one of 'e', 'f', 'g', 'r' or 's'. 'e', 'f' and 'g' |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
708 correspond to '%e', '%f' and '%g'; 'r' and 's' correspond |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
709 to repr and str. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
710 mode is one of '0', '2' or '3', and is completely determined by |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
711 format_code: 'e', 'g' and 's' use mode 2; 'f' mode 3, 'r' mode 0. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
712 precision is the desired precision |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
713 always_add_sign is nonzero if a '+' sign should be included for positive |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
714 numbers |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
715 add_dot_0_if_integer is nonzero if integers in non-exponential form |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
716 should have ".0" added. Only applies to format codes 'r', 's', and 'g'. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
717 use_alt_formatting is nonzero if alternative formatting should be |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
718 used. Only applies to format codes 'e', 'f' and 'g'. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
719 type, if non-NULL, will be set to one of these constants to identify |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
720 the type of the 'd' argument: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
721 Py_DTST_FINITE |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
722 Py_DTST_INFINITE |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
723 Py_DTST_NAN |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
724 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
725 Returns a PyMem_Malloc'd block of memory containing the resulting string, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
726 or NULL on error. If NULL is returned, the Python error has been set. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
727 */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
728 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
729 static char * |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
730 format_float_short(double d, char format_code, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
731 int mode, Py_ssize_t precision, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
732 int always_add_sign, int add_dot_0_if_integer, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
733 int use_alt_formatting, char **float_strings, int *type) |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
734 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
735 char *buf = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
736 char *p = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
737 Py_ssize_t bufsize = 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
738 char *digits, *digits_end; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
739 int decpt_as_int, sign, exp_len, exp = 0, use_exp = 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
740 Py_ssize_t decpt, digits_len, vdigits_start, vdigits_end; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
741 _Py_SET_53BIT_PRECISION_HEADER; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
742 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
743 /* _Py_dg_dtoa returns a digit string (no decimal point or exponent). |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
744 Must be matched by a call to _Py_dg_freedtoa. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
745 _Py_SET_53BIT_PRECISION_START; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
746 digits = _Py_dg_dtoa(d, mode, precision, &decpt_as_int, &sign, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
747 &digits_end); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
748 _Py_SET_53BIT_PRECISION_END; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
749 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
750 decpt = (Py_ssize_t)decpt_as_int; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
751 if (digits == NULL) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
752 /* The only failure mode is no memory. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
753 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
754 goto exit; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
755 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
756 assert(digits_end != NULL && digits_end >= digits); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
757 digits_len = digits_end - digits; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
758 |
|
53210
13916bb2eff0
Issue 5780: Fix test_float failures for legacy style float repr.
Mark Dickinson <dickinsm@gmail.com>
parents:
53190
diff
changeset
|
759 if (digits_len && !isdigit(Py_CHARMASK(digits[0]))) { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
760 /* Infinities and nans here; adapt Gay's output, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
761 so convert Infinity to inf and NaN to nan, and |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
762 ignore sign of nan. Then return. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
763 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
764 /* ignore the actual sign of a nan */ |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
765 if (digits[0] == 'n' || digits[0] == 'N') |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
766 sign = 0; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
767 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
768 /* We only need 5 bytes to hold the result "+inf\0" . */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
769 bufsize = 5; /* Used later in an assert. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
770 buf = (char *)PyMem_Malloc(bufsize); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
771 if (buf == NULL) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
772 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
773 goto exit; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
774 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
775 p = buf; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
776 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
777 if (sign == 1) { |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
778 *p++ = '-'; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
779 } |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
780 else if (always_add_sign) { |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
781 *p++ = '+'; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53210
diff
changeset
|
782 } |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
783 if (digits[0] == 'i' || digits[0] == 'I') { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
784 strncpy(p, float_strings[OFS_INF], 3); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
785 p += 3; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
786 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
787 if (type) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
788 *type = Py_DTST_INFINITE; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
789 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
790 else if (digits[0] == 'n' || digits[0] == 'N') { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
791 strncpy(p, float_strings[OFS_NAN], 3); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
792 p += 3; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
793 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
794 if (type) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
795 *type = Py_DTST_NAN; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
796 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
797 else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
798 /* shouldn't get here: Gay's code should always return |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
799 something starting with a digit, an 'I', or 'N' */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
800 strncpy(p, "ERR", 3); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
801 p += 3; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
802 assert(0); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
803 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
804 goto exit; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
805 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
806 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
807 /* The result must be finite (not inf or nan). */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
808 if (type) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
809 *type = Py_DTST_FINITE; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
810 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
811 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
812 /* We got digits back, format them. We may need to pad 'digits' |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
813 either on the left or right (or both) with extra zeros, so in |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
814 general the resulting string has the form |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
815 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
816 [<sign>]<zeros><digits><zeros>[<exponent>] |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
817 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
818 where either of the <zeros> pieces could be empty, and there's a |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
819 decimal point that could appear either in <digits> or in the |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
820 leading or trailing <zeros>. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
821 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
822 Imagine an infinite 'virtual' string vdigits, consisting of the |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
823 string 'digits' (starting at index 0) padded on both the left and |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
824 right with infinite strings of zeros. We want to output a slice |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
825 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
826 vdigits[vdigits_start : vdigits_end] |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
827 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
828 of this virtual string. Thus if vdigits_start < 0 then we'll end |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
829 up producing some leading zeros; if vdigits_end > digits_len there |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
830 will be trailing zeros in the output. The next section of code |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
831 determines whether to use an exponent or not, figures out the |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
832 position 'decpt' of the decimal point, and computes 'vdigits_start' |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
833 and 'vdigits_end'. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
834 vdigits_end = digits_len; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
835 switch (format_code) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
836 case 'e': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
837 use_exp = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
838 vdigits_end = precision; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
839 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
840 case 'f': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
841 vdigits_end = decpt + precision; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
842 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
843 case 'g': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
844 if (decpt <= -4 || decpt > precision) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
845 use_exp = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
846 if (use_alt_formatting) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
847 vdigits_end = precision; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
848 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
849 case 'r': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
850 /* convert to exponential format at 1e16. We used to convert |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
851 at 1e17, but that gives odd-looking results for some values |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
852 when a 16-digit 'shortest' repr is padded with bogus zeros. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
853 For example, repr(2e16+8) would give 20000000000000010.0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
854 the true value is 20000000000000008.0. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
855 if (decpt <= -4 || decpt > 16) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
856 use_exp = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
857 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
858 case 's': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
859 /* if we're forcing a digit after the point, convert to |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
860 exponential format at 1e11. If not, convert at 1e12. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
861 if (decpt <= -4 || decpt > |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
862 (add_dot_0_if_integer ? precision-1 : precision)) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
863 use_exp = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
864 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
865 default: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
866 PyErr_BadInternalCall(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
867 goto exit; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
868 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
869 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
870 /* if using an exponent, reset decimal point position to 1 and adjust |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
871 exponent accordingly.*/ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
872 if (use_exp) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
873 exp = decpt - 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
874 decpt = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
875 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
876 /* ensure vdigits_start < decpt <= vdigits_end, or vdigits_start < |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
877 decpt < vdigits_end if add_dot_0_if_integer and no exponent */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
878 vdigits_start = decpt <= 0 ? decpt-1 : 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
879 if (!use_exp && add_dot_0_if_integer) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
880 vdigits_end = vdigits_end > decpt ? vdigits_end : decpt + 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
881 else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
882 vdigits_end = vdigits_end > decpt ? vdigits_end : decpt; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
883 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
884 /* double check inequalities */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
885 assert(vdigits_start <= 0 && |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
886 0 <= digits_len && |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
887 digits_len <= vdigits_end); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
888 /* decimal point should be in (vdigits_start, vdigits_end] */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
889 assert(vdigits_start < decpt && decpt <= vdigits_end); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
890 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
891 /* Compute an upper bound how much memory we need. This might be a few |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
892 chars too long, but no big deal. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
893 bufsize = |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
894 /* sign, decimal point and trailing 0 byte */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
895 3 + |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
896 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
897 /* total digit count (including zero padding on both sides) */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
898 (vdigits_end - vdigits_start) + |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
899 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
900 /* exponent "e+100", max 3 numerical digits */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
901 (use_exp ? 5 : 0); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
902 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
903 /* Now allocate the memory and initialize p to point to the start of |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
904 it. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
905 buf = (char *)PyMem_Malloc(bufsize); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
906 if (buf == NULL) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
907 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
908 goto exit; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
909 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
910 p = buf; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
911 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
912 /* Add a negative sign if negative, and a plus sign if non-negative |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
913 and always_add_sign is true. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
914 if (sign == 1) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
915 *p++ = '-'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
916 else if (always_add_sign) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
917 *p++ = '+'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
918 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
919 /* note that exactly one of the three 'if' conditions is true, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
920 so we include exactly one decimal point */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
921 /* Zero padding on left of digit string */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
922 if (decpt <= 0) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
923 memset(p, '0', decpt-vdigits_start); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
924 p += decpt - vdigits_start; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
925 *p++ = '.'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
926 memset(p, '0', 0-decpt); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
927 p += 0-decpt; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
928 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
929 else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
930 memset(p, '0', 0-vdigits_start); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
931 p += 0 - vdigits_start; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
932 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
933 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
934 /* Digits, with included decimal point */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
935 if (0 < decpt && decpt <= digits_len) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
936 strncpy(p, digits, decpt-0); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
937 p += decpt-0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
938 *p++ = '.'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
939 strncpy(p, digits+decpt, digits_len-decpt); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
940 p += digits_len-decpt; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
941 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
942 else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
943 strncpy(p, digits, digits_len); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
944 p += digits_len; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
945 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
946 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
947 /* And zeros on the right */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
948 if (digits_len < decpt) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
949 memset(p, '0', decpt-digits_len); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
950 p += decpt-digits_len; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
951 *p++ = '.'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
952 memset(p, '0', vdigits_end-decpt); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
953 p += vdigits_end-decpt; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
954 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
955 else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
956 memset(p, '0', vdigits_end-digits_len); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
957 p += vdigits_end-digits_len; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
958 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
959 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
960 /* Delete a trailing decimal pt unless using alternative formatting. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
961 if (p[-1] == '.' && !use_alt_formatting) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
962 p--; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
963 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
964 /* Now that we've done zero padding, add an exponent if needed. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
965 if (use_exp) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
966 *p++ = float_strings[OFS_E][0]; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
967 exp_len = sprintf(p, "%+.02d", exp); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
968 p += exp_len; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
969 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
970 exit: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
971 if (buf) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
972 *p = '\0'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
973 /* It's too late if this fails, as we've already stepped on |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
974 memory that isn't ours. But it's an okay debugging test. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
975 assert(p-buf < bufsize); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
976 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
977 if (digits) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
978 _Py_dg_freedtoa(digits); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
979 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
980 return buf; |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff
changeset
|
981 } |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
982 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
983 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
984 PyAPI_FUNC(char *) PyOS_double_to_string(double val, |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
985 char format_code, |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
986 int precision, |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
987 int flags, |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
988 int *type) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
989 { |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
990 char **float_strings = lc_float_strings; |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
991 int mode; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
992 |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
993 /* Validate format_code, and map upper and lower case. Compute the |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
994 mode and make any adjustments as needed. */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
995 switch (format_code) { |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
996 /* exponent */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
997 case 'E': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
998 float_strings = uc_float_strings; |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
999 format_code = 'e'; |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1000 /* Fall through. */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1001 case 'e': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1002 mode = 2; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1003 precision++; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1004 break; |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1005 |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1006 /* fixed */ |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1007 case 'F': |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1008 float_strings = uc_float_strings; |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1009 format_code = 'f'; |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1010 /* Fall through. */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1011 case 'f': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1012 mode = 3; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1013 break; |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1014 |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1015 /* general */ |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1016 case 'G': |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1017 float_strings = uc_float_strings; |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1018 format_code = 'g'; |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1019 /* Fall through. */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1020 case 'g': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1021 mode = 2; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1022 /* precision 0 makes no sense for 'g' format; interpret as 1 */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1023 if (precision == 0) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1024 precision = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1025 break; |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1026 |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1027 /* repr format */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1028 case 'r': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1029 mode = 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1030 /* Supplied precision is unused, must be 0. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1031 if (precision != 0) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1032 PyErr_BadInternalCall(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1033 return NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1034 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1035 break; |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1036 |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1037 /* str format */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1038 case 's': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1039 mode = 2; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1040 /* Supplied precision is unused, must be 0. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1041 if (precision != 0) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1042 PyErr_BadInternalCall(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1043 return NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1044 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1045 precision = 12; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1046 break; |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1047 |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1048 default: |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1049 PyErr_BadInternalCall(); |
|
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1050 return NULL; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1051 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1052 |
|
53190
d84ad973cde2
Simplify PyOS_double_to_string.
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
1053 return format_float_short(val, format_code, mode, precision, |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1054 flags & Py_DTSF_SIGN, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1055 flags & Py_DTSF_ADD_DOT_0, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1056 flags & Py_DTSF_ALT, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1057 float_strings, type); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1058 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
52773
diff
changeset
|
1059 #endif /* ifdef PY_NO_SHORT_FLOAT_REPR */ |
