Mercurial > cpython-lru_cache-weakref
annotate Objects/stringlib/formatter.h @ 71285:8bc9dbc61ba6 3.2
Issue #12326: document the recommended idiom for checking sys.platform on Unix systems.
Also, point to the various alternatives.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Sat, 09 Jul 2011 15:54:23 +0200 |
| parents | 3c9232a684ae |
| children | 5e456e1a9e8c |
| rev | line source |
|---|---|
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1 /* implements the string, long, and float formatters. that is, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
2 string.__format__, etc. */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
3 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
4 #include <locale.h> |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
5 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
6 /* Before including this, you must include either: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
7 stringlib/unicodedefs.h |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
8 stringlib/stringdefs.h |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
9 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
10 Also, you should define the names: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
11 FORMAT_STRING |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
12 FORMAT_LONG |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
13 FORMAT_FLOAT |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
14 FORMAT_COMPLEX |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
15 to be whatever you want the public names of these functions to |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
16 be. These are the only non-static functions defined here. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
17 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
18 |
|
51758
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
19 /* Raises an exception about an unknown presentation type for this |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
20 * type. */ |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
21 |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
22 static void |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
23 unknown_presentation_type(STRINGLIB_CHAR presentation_type, |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
24 const char* type_name) |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
25 { |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
26 #if STRINGLIB_IS_UNICODE |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
27 /* If STRINGLIB_CHAR is Py_UNICODE, %c might be out-of-range, |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
28 hence the two cases. If it is char, gcc complains that the |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
29 condition below is always true, hence the ifdef. */ |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
30 if (presentation_type > 32 && presentation_type < 128) |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
31 #endif |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
32 PyErr_Format(PyExc_ValueError, |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
33 "Unknown format code '%c' " |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
34 "for object of type '%.200s'", |
|
55511
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
35 (char)presentation_type, |
|
51758
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
36 type_name); |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
37 #if STRINGLIB_IS_UNICODE |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
38 else |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
39 PyErr_Format(PyExc_ValueError, |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
40 "Unknown format code '\\x%x' " |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
41 "for object of type '%.200s'", |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
42 (unsigned int)presentation_type, |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
43 type_name); |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
44 #endif |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
45 } |
|
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
46 |
|
55511
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
47 static void |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
48 invalid_comma_type(STRINGLIB_CHAR presentation_type) |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
49 { |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
50 #if STRINGLIB_IS_UNICODE |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
51 /* See comment in unknown_presentation_type */ |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
52 if (presentation_type > 32 && presentation_type < 128) |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
53 #endif |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
54 PyErr_Format(PyExc_ValueError, |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
55 "Cannot specify ',' with '%c'.", |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
56 (char)presentation_type); |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
57 #if STRINGLIB_IS_UNICODE |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
58 else |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
59 PyErr_Format(PyExc_ValueError, |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
60 "Cannot specify ',' with '\\x%x'.", |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
61 (unsigned int)presentation_type); |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
62 #endif |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
63 } |
|
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
64 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
65 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
66 get_integer consumes 0 or more decimal digit characters from an |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
67 input string, updates *result with the corresponding positive |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
68 integer, and returns the number of digits consumed. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
69 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
70 returns -1 on error. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
71 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
72 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
73 get_integer(STRINGLIB_CHAR **ptr, STRINGLIB_CHAR *end, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
74 Py_ssize_t *result) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
75 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
76 Py_ssize_t accumulator, digitval, oldaccumulator; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
77 int numdigits; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
78 accumulator = numdigits = 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
79 for (;;(*ptr)++, numdigits++) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
80 if (*ptr >= end) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
81 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
82 digitval = STRINGLIB_TODECIMAL(**ptr); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
83 if (digitval < 0) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
84 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
85 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
86 This trick was copied from old Unicode format code. It's cute, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
87 but would really suck on an old machine with a slow divide |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
88 implementation. Fortunately, in the normal case we do not |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
89 expect too many digits. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
90 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
91 oldaccumulator = accumulator; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
92 accumulator *= 10; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
93 if ((accumulator+10)/10 != oldaccumulator+1) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
94 PyErr_Format(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
95 "Too many decimal digits in format string"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
96 return -1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
97 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
98 accumulator += digitval; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
99 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
100 *result = accumulator; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
101 return numdigits; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
102 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
103 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
104 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
105 /*********** standard format specifier parsing **************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
106 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
107 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
108 /* returns true if this character is a specifier alignment token */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
109 Py_LOCAL_INLINE(int) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
110 is_alignment_token(STRINGLIB_CHAR c) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
111 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
112 switch (c) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
113 case '<': case '>': case '=': case '^': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
114 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
115 default: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
116 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
117 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
118 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
119 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
120 /* returns true if this character is a sign element */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
121 Py_LOCAL_INLINE(int) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
122 is_sign_element(STRINGLIB_CHAR c) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
123 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
124 switch (c) { |
|
42980
9df911d654af
Added conditional compilation for '()', which was an allowed sign code in a
Eric Smith <eric@trueblade.com>
parents:
42929
diff
changeset
|
125 case ' ': case '+': case '-': |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
126 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
127 default: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
128 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
129 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
130 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
131 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
132 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
133 typedef struct { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
134 STRINGLIB_CHAR fill_char; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
135 STRINGLIB_CHAR align; |
| 48472 | 136 int alternate; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
137 STRINGLIB_CHAR sign; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
138 Py_ssize_t width; |
|
52773
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
139 int thousands_separators; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
140 Py_ssize_t precision; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
141 STRINGLIB_CHAR type; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
142 } InternalFormatSpec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
143 |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
144 |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
145 #if 0 |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
146 /* Occassionally useful for debugging. Should normally be commented out. */ |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
147 static void |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
148 DEBUG_PRINT_FORMAT_SPEC(InternalFormatSpec *format) |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
149 { |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
150 printf("internal format spec: fill_char %d\n", format->fill_char); |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
151 printf("internal format spec: align %d\n", format->align); |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
152 printf("internal format spec: alternate %d\n", format->alternate); |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
153 printf("internal format spec: sign %d\n", format->sign); |
|
59046
8e8c45ab44dc
Merged revisions 78350 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
59028
diff
changeset
|
154 printf("internal format spec: width %zd\n", format->width); |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
155 printf("internal format spec: thousands_separators %d\n", |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
156 format->thousands_separators); |
|
59046
8e8c45ab44dc
Merged revisions 78350 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
59028
diff
changeset
|
157 printf("internal format spec: precision %zd\n", format->precision); |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
158 printf("internal format spec: type %c\n", format->type); |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
159 printf("\n"); |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
160 } |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
161 #endif |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
162 |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
163 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
164 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
165 ptr points to the start of the format_spec, end points just past its end. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
166 fills in format with the parsed information. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
167 returns 1 on success, 0 on failure. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
168 if failure, sets the exception |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
169 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
170 static int |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
171 parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
172 Py_ssize_t format_spec_len, |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
173 InternalFormatSpec *format, |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
174 char default_type, |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
175 char default_align) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
176 { |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
177 STRINGLIB_CHAR *ptr = format_spec; |
|
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
178 STRINGLIB_CHAR *end = format_spec + format_spec_len; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
179 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
180 /* end-ptr is used throughout this code to specify the length of |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
181 the input string */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
182 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
183 Py_ssize_t consumed; |
|
59046
8e8c45ab44dc
Merged revisions 78350 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
59028
diff
changeset
|
184 int align_specified = 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
185 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
186 format->fill_char = '\0'; |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
187 format->align = default_align; |
| 48472 | 188 format->alternate = 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
189 format->sign = '\0'; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
190 format->width = -1; |
|
52773
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
191 format->thousands_separators = 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
192 format->precision = -1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
193 format->type = default_type; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
194 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
195 /* If the second char is an alignment token, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
196 then parse the fill char */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
197 if (end-ptr >= 2 && is_alignment_token(ptr[1])) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
198 format->align = ptr[1]; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
199 format->fill_char = ptr[0]; |
|
59046
8e8c45ab44dc
Merged revisions 78350 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
59028
diff
changeset
|
200 align_specified = 1; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
201 ptr += 2; |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42817
diff
changeset
|
202 } |
|
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42817
diff
changeset
|
203 else if (end-ptr >= 1 && is_alignment_token(ptr[0])) { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
204 format->align = ptr[0]; |
|
59046
8e8c45ab44dc
Merged revisions 78350 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
59028
diff
changeset
|
205 align_specified = 1; |
|
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:
45382
diff
changeset
|
206 ++ptr; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
207 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
208 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
209 /* Parse the various sign options */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
210 if (end-ptr >= 1 && is_sign_element(ptr[0])) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
211 format->sign = ptr[0]; |
|
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:
45382
diff
changeset
|
212 ++ptr; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
213 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
214 |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
215 /* If the next character is #, we're in alternate mode. This only |
|
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
216 applies to integers. */ |
|
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
217 if (end-ptr >= 1 && ptr[0] == '#') { |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
218 format->alternate = 1; |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
219 ++ptr; |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
220 } |
|
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
221 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
222 /* The special case for 0-padding (backwards compat) */ |
| 43097 | 223 if (format->fill_char == '\0' && end-ptr >= 1 && ptr[0] == '0') { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
224 format->fill_char = '0'; |
|
59046
8e8c45ab44dc
Merged revisions 78350 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
59028
diff
changeset
|
225 if (!align_specified) { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
226 format->align = '='; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
227 } |
|
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:
45382
diff
changeset
|
228 ++ptr; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
229 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
230 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
231 consumed = get_integer(&ptr, end, &format->width); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
232 if (consumed == -1) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
233 /* Overflow error. Exception already set. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
234 return 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
235 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
236 /* If consumed is 0, we didn't consume any characters for the |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
237 width. In that case, reset the width to -1, because |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
238 get_integer() will have set it to zero. -1 is how we record |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
239 that the width wasn't specified. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
240 if (consumed == 0) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
241 format->width = -1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
242 |
|
52773
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
243 /* Comma signifies add thousands separators */ |
|
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
244 if (end-ptr && ptr[0] == ',') { |
|
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
245 format->thousands_separators = 1; |
|
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
246 ++ptr; |
|
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
247 } |
|
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
248 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
249 /* Parse field precision */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
250 if (end-ptr && ptr[0] == '.') { |
|
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:
45382
diff
changeset
|
251 ++ptr; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
252 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
253 consumed = get_integer(&ptr, end, &format->precision); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
254 if (consumed == -1) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
255 /* Overflow error. Exception already set. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
256 return 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
257 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
258 /* Not having a precision after a dot is an error. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
259 if (consumed == 0) { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
260 PyErr_Format(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
261 "Format specifier missing precision"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
262 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
263 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
264 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
265 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
266 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
267 /* Finally, parse the type field. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
268 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
269 if (end-ptr > 1) { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
270 /* More than one char remain, invalid conversion spec. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
271 PyErr_Format(PyExc_ValueError, "Invalid conversion specification"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
272 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
273 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
274 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
275 if (end-ptr == 1) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
276 format->type = ptr[0]; |
|
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:
45382
diff
changeset
|
277 ++ptr; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
278 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
279 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
280 /* Do as much validating as we can, just by looking at the format |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
281 specifier. Do not take into account what type of formatting |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
282 we're doing (int, float, string). */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
283 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
284 if (format->thousands_separators) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
285 switch (format->type) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
286 case 'd': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
287 case 'e': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
288 case 'f': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
289 case 'g': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
290 case 'E': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
291 case 'G': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
292 case '%': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
293 case 'F': |
|
53320
513dc6fa61c0
Merged revisions 71802 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
53187
diff
changeset
|
294 case '\0': |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
295 /* These are allowed. See PEP 378.*/ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
296 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
297 default: |
|
55511
55e02fa7a11c
Merged revisions 74269 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
298 invalid_comma_type(format->type); |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
299 return 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
300 } |
|
52773
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
301 } |
|
28096ed73153
Added ',' thousands grouping to int.__format__. See PEP 378.
Eric Smith <eric@trueblade.com>
parents:
52772
diff
changeset
|
302 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
303 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
304 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
305 |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
306 /* Calculate the padding needed. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
307 static void |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
308 calc_padding(Py_ssize_t nchars, Py_ssize_t width, STRINGLIB_CHAR align, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
309 Py_ssize_t *n_lpadding, Py_ssize_t *n_rpadding, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
310 Py_ssize_t *n_total) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
311 { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
312 if (width >= 0) { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
313 if (nchars > width) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
314 *n_total = nchars; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
315 else |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
316 *n_total = width; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
317 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
318 else { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
319 /* not specified, use all of the chars and no more */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
320 *n_total = nchars; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
321 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
322 |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
323 /* Figure out how much leading space we need, based on the |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
324 aligning */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
325 if (align == '>') |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
326 *n_lpadding = *n_total - nchars; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
327 else if (align == '^') |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
328 *n_lpadding = (*n_total - nchars) / 2; |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
329 else if (align == '<' || align == '=') |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
330 *n_lpadding = 0; |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
331 else { |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
332 /* We should never have an unspecified alignment. */ |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
333 *n_lpadding = 0; |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
334 assert(0); |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
335 } |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
336 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
337 *n_rpadding = *n_total - nchars - *n_lpadding; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
338 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
339 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
340 /* Do the padding, and return a pointer to where the caller-supplied |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
341 content goes. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
342 static STRINGLIB_CHAR * |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
343 fill_padding(STRINGLIB_CHAR *p, Py_ssize_t nchars, STRINGLIB_CHAR fill_char, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
344 Py_ssize_t n_lpadding, Py_ssize_t n_rpadding) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
345 { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
346 /* Pad on left. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
347 if (n_lpadding) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
348 STRINGLIB_FILL(p, fill_char, n_lpadding); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
349 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
350 /* Pad on right. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
351 if (n_rpadding) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
352 STRINGLIB_FILL(p + nchars + n_lpadding, fill_char, n_rpadding); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
353 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
354 /* Pointer to the user content. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
355 return p + n_lpadding; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
356 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
357 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
358 #if defined FORMAT_FLOAT || defined FORMAT_LONG || defined FORMAT_COMPLEX |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
359 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
360 /*********** common routines for numeric formatting *********************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
361 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
362 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
363 /* Locale type codes. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
364 #define LT_CURRENT_LOCALE 0 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
365 #define LT_DEFAULT_LOCALE 1 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
366 #define LT_NO_LOCALE 2 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
367 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
368 /* Locale info needed for formatting integers and the part of floats |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
369 before and including the decimal. Note that locales only support |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
370 8-bit chars, not unicode. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
371 typedef struct { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
372 char *decimal_point; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
373 char *thousands_sep; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
374 char *grouping; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
375 } LocaleInfo; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
376 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
377 /* describes the layout for an integer, see the comment in |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
378 calc_number_widths() for details */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
379 typedef struct { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
380 Py_ssize_t n_lpadding; |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
381 Py_ssize_t n_prefix; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
382 Py_ssize_t n_spadding; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
383 Py_ssize_t n_rpadding; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
384 char sign; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
385 Py_ssize_t n_sign; /* number of digits needed for sign (0/1) */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
386 Py_ssize_t n_grouped_digits; /* Space taken up by the digits, including |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
387 any grouping chars. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
388 Py_ssize_t n_decimal; /* 0 if only an integer */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
389 Py_ssize_t n_remainder; /* Digits in decimal and/or exponent part, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
390 excluding the decimal itself, if |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
391 present. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
392 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
393 /* These 2 are not the widths of fields, but are needed by |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
394 STRINGLIB_GROUPING. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
395 Py_ssize_t n_digits; /* The number of digits before a decimal |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
396 or exponent. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
397 Py_ssize_t n_min_width; /* The min_width we used when we computed |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
398 the n_grouped_digits width. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
399 } NumberFieldWidths; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
400 |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
401 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
402 /* Given a number of the form: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
403 digits[remainder] |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
404 where ptr points to the start and end points to the end, find where |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
405 the integer part ends. This could be a decimal, an exponent, both, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
406 or neither. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
407 If a decimal point is present, set *has_decimal and increment |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
408 remainder beyond it. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
409 Results are undefined (but shouldn't crash) for improperly |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
410 formatted strings. |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
411 */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
412 static void |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
413 parse_number(STRINGLIB_CHAR *ptr, Py_ssize_t len, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
414 Py_ssize_t *n_remainder, int *has_decimal) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
415 { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
416 STRINGLIB_CHAR *end = ptr + len; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
417 STRINGLIB_CHAR *remainder; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
418 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
419 while (ptr<end && isdigit(*ptr)) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
420 ++ptr; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
421 remainder = ptr; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
422 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
423 /* Does remainder start with a decimal point? */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
424 *has_decimal = ptr<end && *remainder == '.'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
425 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
426 /* Skip the decimal point. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
427 if (*has_decimal) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
428 remainder++; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
429 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
430 *n_remainder = end - remainder; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
431 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
432 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
433 /* not all fields of format are used. for example, precision is |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
434 unused. should this take discrete params in order to be more clear |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
435 about what it does? or is passing a single format parameter easier |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
436 and more efficient enough to justify a little obfuscation? */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
437 static Py_ssize_t |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
438 calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
439 STRINGLIB_CHAR sign_char, STRINGLIB_CHAR *number, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
440 Py_ssize_t n_number, Py_ssize_t n_remainder, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
441 int has_decimal, const LocaleInfo *locale, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
442 const InternalFormatSpec *format) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
443 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
444 Py_ssize_t n_non_digit_non_padding; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
445 Py_ssize_t n_padding; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
446 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
447 spec->n_digits = n_number - n_remainder - (has_decimal?1:0); |
|
48504
59ac5aef3b2d
Merged revisions 65023 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48482
diff
changeset
|
448 spec->n_lpadding = 0; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
449 spec->n_prefix = n_prefix; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
450 spec->n_decimal = has_decimal ? strlen(locale->decimal_point) : 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
451 spec->n_remainder = n_remainder; |
|
48504
59ac5aef3b2d
Merged revisions 65023 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48482
diff
changeset
|
452 spec->n_spadding = 0; |
|
59ac5aef3b2d
Merged revisions 65023 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48482
diff
changeset
|
453 spec->n_rpadding = 0; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
454 spec->sign = '\0'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
455 spec->n_sign = 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
456 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
457 /* the output will look like: |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
458 | | |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
459 | <lpadding> <sign> <prefix> <spadding> <grouped_digits> <decimal> <remainder> <rpadding> | |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
460 | | |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
461 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
462 sign is computed from format->sign and the actual |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
463 sign of the number |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
464 |
| 48472 | 465 prefix is given (it's for the '0x' prefix) |
| 466 | |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
467 digits is already known |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
468 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
469 the total width is either given, or computed from the |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
470 actual digits |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
471 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
472 only one of lpadding, spadding, and rpadding can be non-zero, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
473 and it's calculated from the width and other fields |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
474 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
475 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
476 /* compute the various parts we're going to write */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
477 switch (format->sign) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
478 case '+': |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
479 /* always put a + or - */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
480 spec->n_sign = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
481 spec->sign = (sign_char == '-' ? '-' : '+'); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
482 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
483 case ' ': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
484 spec->n_sign = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
485 spec->sign = (sign_char == '-' ? '-' : ' '); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
486 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
487 default: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
488 /* Not specified, or the default (-) */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
489 if (sign_char == '-') { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
490 spec->n_sign = 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
491 spec->sign = '-'; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
492 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
493 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
494 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
495 /* The number of chars used for non-digits and non-padding. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
496 n_non_digit_non_padding = spec->n_sign + spec->n_prefix + spec->n_decimal + |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
497 spec->n_remainder; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
498 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
499 /* min_width can go negative, that's okay. format->width == -1 means |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
500 we don't care. */ |
|
59046
8e8c45ab44dc
Merged revisions 78350 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
59028
diff
changeset
|
501 if (format->fill_char == '0' && format->align == '=') |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
502 spec->n_min_width = format->width - n_non_digit_non_padding; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
503 else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
504 spec->n_min_width = 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
505 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
506 if (spec->n_digits == 0) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
507 /* This case only occurs when using 'c' formatting, we need |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
508 to special case it because the grouping code always wants |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
509 to have at least one character. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
510 spec->n_grouped_digits = 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
511 else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
512 spec->n_grouped_digits = STRINGLIB_GROUPING(NULL, 0, NULL, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
513 spec->n_digits, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
514 spec->n_min_width, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
515 locale->grouping, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
516 locale->thousands_sep); |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
517 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
518 /* Given the desired width and the total of digit and non-digit |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
519 space we consume, see if we need any padding. format->width can |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
520 be negative (meaning no padding), but this code still works in |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
521 that case. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
522 n_padding = format->width - |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
523 (n_non_digit_non_padding + spec->n_grouped_digits); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
524 if (n_padding > 0) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
525 /* Some padding is needed. Determine if it's left, space, or right. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
526 switch (format->align) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
527 case '<': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
528 spec->n_rpadding = n_padding; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
529 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
530 case '^': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
531 spec->n_lpadding = n_padding / 2; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
532 spec->n_rpadding = n_padding - spec->n_lpadding; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
533 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
534 case '=': |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
535 spec->n_spadding = n_padding; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
536 break; |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
537 case '>': |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
538 spec->n_lpadding = n_padding; |
|
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
539 break; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
540 default: |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
541 /* Shouldn't get here, but treat it as '>' */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
542 spec->n_lpadding = n_padding; |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
543 assert(0); |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
544 break; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
545 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
546 } |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
547 return spec->n_lpadding + spec->n_sign + spec->n_prefix + |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
548 spec->n_spadding + spec->n_grouped_digits + spec->n_decimal + |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
549 spec->n_remainder + spec->n_rpadding; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
550 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
551 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
552 /* Fill in the digit parts of a numbers's string representation, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
553 as determined in calc_number_widths(). |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
554 No error checking, since we know the buffer is the correct size. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
555 static void |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
556 fill_number(STRINGLIB_CHAR *buf, const NumberFieldWidths *spec, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
557 STRINGLIB_CHAR *digits, Py_ssize_t n_digits, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
558 STRINGLIB_CHAR *prefix, STRINGLIB_CHAR fill_char, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
559 LocaleInfo *locale, int toupper) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
560 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
561 /* Used to keep track of digits, decimal, and remainder. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
562 STRINGLIB_CHAR *p = digits; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
563 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
564 #ifndef NDEBUG |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
565 Py_ssize_t r; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
566 #endif |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
567 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
568 if (spec->n_lpadding) { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
569 STRINGLIB_FILL(buf, fill_char, spec->n_lpadding); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
570 buf += spec->n_lpadding; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
571 } |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
572 if (spec->n_sign == 1) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
573 *buf++ = spec->sign; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
574 } |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
575 if (spec->n_prefix) { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
576 memmove(buf, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
577 prefix, |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
578 spec->n_prefix * sizeof(STRINGLIB_CHAR)); |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
579 if (toupper) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
580 Py_ssize_t t; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
581 for (t = 0; t < spec->n_prefix; ++t) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
582 buf[t] = STRINGLIB_TOUPPER(buf[t]); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
583 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
584 buf += spec->n_prefix; |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
585 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
586 if (spec->n_spadding) { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
587 STRINGLIB_FILL(buf, fill_char, spec->n_spadding); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
588 buf += spec->n_spadding; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
589 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
590 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
591 /* Only for type 'c' special case, it has no digits. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
592 if (spec->n_digits != 0) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
593 /* Fill the digits with InsertThousandsGrouping. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
594 #ifndef NDEBUG |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
595 r = |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
596 #endif |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
597 STRINGLIB_GROUPING(buf, spec->n_grouped_digits, digits, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
598 spec->n_digits, spec->n_min_width, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
599 locale->grouping, locale->thousands_sep); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
600 #ifndef NDEBUG |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
601 assert(r == spec->n_grouped_digits); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
602 #endif |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
603 p += spec->n_digits; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
604 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
605 if (toupper) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
606 Py_ssize_t t; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
607 for (t = 0; t < spec->n_grouped_digits; ++t) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
608 buf[t] = STRINGLIB_TOUPPER(buf[t]); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
609 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
610 buf += spec->n_grouped_digits; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
611 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
612 if (spec->n_decimal) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
613 Py_ssize_t t; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
614 for (t = 0; t < spec->n_decimal; ++t) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
615 buf[t] = locale->decimal_point[t]; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
616 buf += spec->n_decimal; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
617 p += 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
618 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
619 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
620 if (spec->n_remainder) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
621 memcpy(buf, p, spec->n_remainder * sizeof(STRINGLIB_CHAR)); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
622 buf += spec->n_remainder; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
623 p += spec->n_remainder; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
624 } |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
625 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
626 if (spec->n_rpadding) { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
627 STRINGLIB_FILL(buf, fill_char, spec->n_rpadding); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
628 buf += spec->n_rpadding; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
629 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
630 } |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
631 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
632 static char no_grouping[1] = {CHAR_MAX}; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
633 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
634 /* Find the decimal point character(s?), thousands_separator(s?), and |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
635 grouping description, either for the current locale if type is |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
636 LT_CURRENT_LOCALE, a hard-coded locale if LT_DEFAULT_LOCALE, or |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
637 none if LT_NO_LOCALE. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
638 static void |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
639 get_locale_info(int type, LocaleInfo *locale_info) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
640 { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
641 switch (type) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
642 case LT_CURRENT_LOCALE: { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
643 struct lconv *locale_data = localeconv(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
644 locale_info->decimal_point = locale_data->decimal_point; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
645 locale_info->thousands_sep = locale_data->thousands_sep; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
646 locale_info->grouping = locale_data->grouping; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
647 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
648 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
649 case LT_DEFAULT_LOCALE: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
650 locale_info->decimal_point = "."; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
651 locale_info->thousands_sep = ","; |
|
62174
825f65445a0a
Merged revisions 81824 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
62162
diff
changeset
|
652 locale_info->grouping = "\3"; /* Group every 3 characters. The |
|
825f65445a0a
Merged revisions 81824 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
62162
diff
changeset
|
653 (implicit) trailing 0 means repeat |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
654 infinitely. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
655 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
656 case LT_NO_LOCALE: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
657 locale_info->decimal_point = "."; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
658 locale_info->thousands_sep = ""; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
659 locale_info->grouping = no_grouping; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
660 break; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
661 default: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
662 assert(0); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
663 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
664 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
665 |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
666 #endif /* FORMAT_FLOAT || FORMAT_LONG || FORMAT_COMPLEX */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
667 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
668 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
669 /*********** string formatting ******************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
670 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
671 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
672 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
673 format_string_internal(PyObject *value, const InternalFormatSpec *format) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
674 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
675 Py_ssize_t lpad; |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
676 Py_ssize_t rpad; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
677 Py_ssize_t total; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
678 STRINGLIB_CHAR *p; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
679 Py_ssize_t len = STRINGLIB_LEN(value); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
680 PyObject *result = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
681 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
682 /* sign is not allowed on strings */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
683 if (format->sign != '\0') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
684 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
685 "Sign not allowed in string format specifier"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
686 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
687 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
688 |
| 48472 | 689 /* alternate is not allowed on strings */ |
| 690 if (format->alternate) { | |
| 691 PyErr_SetString(PyExc_ValueError, | |
| 692 "Alternate form (#) not allowed in string format " | |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
693 "specifier"); |
| 48472 | 694 goto done; |
| 695 } | |
| 696 | |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
697 /* '=' alignment not allowed on strings */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
698 if (format->align == '=') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
699 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
700 "'=' alignment not allowed " |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
701 "in string format specifier"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
702 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
703 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
704 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
705 /* if precision is specified, output no more that format.precision |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
706 characters */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
707 if (format->precision >= 0 && len >= format->precision) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
708 len = format->precision; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
709 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
710 |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
711 calc_padding(len, format->width, format->align, &lpad, &rpad, &total); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
712 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
713 /* allocate the resulting string */ |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
714 result = STRINGLIB_NEW(NULL, total); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
715 if (result == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
716 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
717 |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
718 /* Write into that space. First the padding. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
719 p = fill_padding(STRINGLIB_STR(result), len, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
720 format->fill_char=='\0'?' ':format->fill_char, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
721 lpad, rpad); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
722 |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
723 /* Then the source string. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
724 memcpy(p, STRINGLIB_STR(value), len * sizeof(STRINGLIB_CHAR)); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
725 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
726 done: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
727 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
728 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
729 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
730 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
731 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
732 /*********** long formatting ********************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
733 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
734 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
735 #if defined FORMAT_LONG || defined FORMAT_INT |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
736 typedef PyObject* |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
737 (*IntOrLongToString)(PyObject *value, int base); |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
738 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
739 static PyObject * |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
740 format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
741 IntOrLongToString tostring) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
742 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
743 PyObject *result = NULL; |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
744 PyObject *tmp = NULL; |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
745 STRINGLIB_CHAR *pnumeric_chars; |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
746 STRINGLIB_CHAR numeric_char; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
747 STRINGLIB_CHAR sign_char = '\0'; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
748 Py_ssize_t n_digits; /* count of digits need from the computed |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
749 string */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
750 Py_ssize_t n_remainder = 0; /* Used only for 'c' formatting, which |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
751 produces non-digits */ |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
752 Py_ssize_t n_prefix = 0; /* Count of prefix chars, (e.g., '0x') */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
753 Py_ssize_t n_total; |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
754 STRINGLIB_CHAR *prefix = NULL; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
755 NumberFieldWidths spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
756 long x; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
757 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
758 /* Locale settings, either from the actual locale or |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
759 from a hard-code pseudo-locale */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
760 LocaleInfo locale; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
761 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
762 /* no precision allowed on integers */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
763 if (format->precision != -1) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
764 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
765 "Precision not allowed in integer format specifier"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
766 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
767 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
768 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
769 /* special case for character formatting */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
770 if (format->type == 'c') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
771 /* error to specify a sign */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
772 if (format->sign != '\0') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
773 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
774 "Sign not allowed with integer" |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
775 " format specifier 'c'"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
776 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
777 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
778 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
779 /* taken from unicodeobject.c formatchar() */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
780 /* Integer input truncated to a character */ |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
781 /* XXX: won't work for int */ |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43172
diff
changeset
|
782 x = PyLong_AsLong(value); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
783 if (x == -1 && PyErr_Occurred()) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
784 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
785 #ifdef Py_UNICODE_WIDE |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
786 if (x < 0 || x > 0x10ffff) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
787 PyErr_SetString(PyExc_OverflowError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
788 "%c arg not in range(0x110000) " |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
789 "(wide Python build)"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
790 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
791 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
792 #else |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
793 if (x < 0 || x > 0xffff) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
794 PyErr_SetString(PyExc_OverflowError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
795 "%c arg not in range(0x10000) " |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
796 "(narrow Python build)"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
797 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
798 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
799 #endif |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
800 numeric_char = (STRINGLIB_CHAR)x; |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
801 pnumeric_chars = &numeric_char; |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
802 n_digits = 1; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
803 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
804 /* As a sort-of hack, we tell calc_number_widths that we only |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
805 have "remainder" characters. calc_number_widths thinks |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
806 these are characters that don't get formatted, only copied |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
807 into the output string. We do this for 'c' formatting, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
808 because the characters are likely to be non-digits. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
809 n_remainder = 1; |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42817
diff
changeset
|
810 } |
|
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42817
diff
changeset
|
811 else { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
812 int base; |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
813 int leading_chars_to_skip = 0; /* Number of characters added by |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
814 PyNumber_ToBase that we want to |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
815 skip over. */ |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
816 |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
817 /* Compute the base and how many characters will be added by |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
818 PyNumber_ToBase */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
819 switch (format->type) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
820 case 'b': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
821 base = 2; |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
822 leading_chars_to_skip = 2; /* 0b */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
823 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
824 case 'o': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
825 base = 8; |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
826 leading_chars_to_skip = 2; /* 0o */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
827 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
828 case 'x': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
829 case 'X': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
830 base = 16; |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
831 leading_chars_to_skip = 2; /* 0x */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
832 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
833 default: /* shouldn't be needed, but stops a compiler warning */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
834 case 'd': |
|
46909
ef4ec968fdb6
Merged revisions 63078 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
46335
diff
changeset
|
835 case 'n': |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
836 base = 10; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
837 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
838 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
839 |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
840 /* The number of prefix chars is the same as the leading |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
841 chars to skip */ |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
842 if (format->alternate) |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
843 n_prefix = leading_chars_to_skip; |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
844 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
845 /* Do the hard part, converting to a string in a given base */ |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
846 tmp = tostring(value, base); |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
847 if (tmp == NULL) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
848 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
849 |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
850 pnumeric_chars = STRINGLIB_STR(tmp); |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
851 n_digits = STRINGLIB_LEN(tmp); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
852 |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
853 prefix = pnumeric_chars; |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
854 |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
855 /* Remember not to modify what pnumeric_chars points to. it |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
856 might be interned. Only modify it after we copy it into a |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
857 newly allocated output buffer. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
858 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
859 /* Is a sign character present in the output? If so, remember it |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
860 and skip it */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
861 if (pnumeric_chars[0] == '-') { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
862 sign_char = pnumeric_chars[0]; |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
863 ++prefix; |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
864 ++leading_chars_to_skip; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
865 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
866 |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
867 /* Skip over the leading chars (0x, 0b, etc.) */ |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
868 n_digits -= leading_chars_to_skip; |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
869 pnumeric_chars += leading_chars_to_skip; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
870 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
871 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
872 /* Determine the grouping, separator, and decimal point, if any. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
873 get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE : |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
874 (format->thousands_separators ? |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
875 LT_DEFAULT_LOCALE : |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
876 LT_NO_LOCALE), |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
877 &locale); |
|
46909
ef4ec968fdb6
Merged revisions 63078 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
46335
diff
changeset
|
878 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
879 /* Calculate how much memory we'll need. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
880 n_total = calc_number_widths(&spec, n_prefix, sign_char, pnumeric_chars, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
881 n_digits, n_remainder, 0, &locale, format); |
|
48360
7e747de231b3
Merged revisions 64499 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48359
diff
changeset
|
882 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
883 /* Allocate the memory. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
884 result = STRINGLIB_NEW(NULL, n_total); |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
885 if (!result) |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
886 goto done; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
887 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
888 /* Populate the memory. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
889 fill_number(STRINGLIB_STR(result), &spec, pnumeric_chars, n_digits, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
890 prefix, format->fill_char == '\0' ? ' ' : format->fill_char, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
891 &locale, format->type == 'X'); |
|
48482
c662e8cffddf
Merged revisions 64984 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48472
diff
changeset
|
892 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
893 done: |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
894 Py_XDECREF(tmp); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
895 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
896 } |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
897 #endif /* defined FORMAT_LONG || defined FORMAT_INT */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
898 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
899 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
900 /*********** float formatting *******************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
901 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
902 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
903 #ifdef FORMAT_FLOAT |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
904 #if STRINGLIB_IS_UNICODE |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
905 static void |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
906 strtounicode(Py_UNICODE *buffer, const char *charbuffer, Py_ssize_t len) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
907 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
908 Py_ssize_t i; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
909 for (i = 0; i < len; ++i) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
910 buffer[i] = (Py_UNICODE)charbuffer[i]; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
911 } |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
912 #endif |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
913 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
914 /* much of this is taken from unicodeobject.c */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
915 static PyObject * |
|
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:
45382
diff
changeset
|
916 format_float_internal(PyObject *value, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
917 const InternalFormatSpec *format) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
918 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
919 char *buf = NULL; /* buffer returned from PyOS_double_to_string */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
920 Py_ssize_t n_digits; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
921 Py_ssize_t n_remainder; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
922 Py_ssize_t n_total; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
923 int has_decimal; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
924 double val; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
925 Py_ssize_t precision = format->precision; |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53665
diff
changeset
|
926 Py_ssize_t default_precision = 6; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
927 STRINGLIB_CHAR type = format->type; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
928 int add_pct = 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
929 STRINGLIB_CHAR *p; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
930 NumberFieldWidths spec; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
931 int flags = 0; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
932 PyObject *result = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
933 STRINGLIB_CHAR sign_char = '\0'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
934 int float_type; /* Used to see if we have a nan, inf, or regular float. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
935 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
936 #if STRINGLIB_IS_UNICODE |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
937 Py_UNICODE *unicode_tmp = NULL; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
938 #endif |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
939 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
940 /* Locale settings, either from the actual locale or |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
941 from a hard-code pseudo-locale */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
942 LocaleInfo locale; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
943 |
|
66444
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
63750
diff
changeset
|
944 if (format->alternate) |
|
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
63750
diff
changeset
|
945 flags |= Py_DTSF_ALT; |
| 48472 | 946 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
947 if (type == '\0') { |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
948 /* Omitted type specifier. Behaves in the same way as repr(x) |
|
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
949 and str(x) if no precision is given, else like 'g', but with |
|
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
950 at least one digit after the decimal point. */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
951 flags |= Py_DTSF_ADD_DOT_0; |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
952 type = 'r'; |
|
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
953 default_precision = 0; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
954 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
955 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
956 if (type == 'n') |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
957 /* 'n' is the same as 'g', except for the locale used to |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
958 format the result. We take care of that later. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
959 type = 'g'; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
960 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
961 val = PyFloat_AsDouble(value); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
962 if (val == -1.0 && PyErr_Occurred()) |
| 43097 | 963 goto done; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
964 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
965 if (type == '%') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
966 type = 'f'; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
967 val *= 100; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
968 add_pct = 1; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
969 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
970 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
971 if (precision < 0) |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53665
diff
changeset
|
972 precision = default_precision; |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
973 else if (type == 'r') |
|
55463
06b86a6e28f1
Merged revisions 74222 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
53849
diff
changeset
|
974 type = 'g'; |
|
53665
511a37ef1a41
Merged revisions 72189 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
53642
diff
changeset
|
975 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
976 /* Cast "type", because if we're in unicode we need to pass a |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
977 8-bit char. This is safe, because we've restricted what "type" |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
978 can be. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
979 buf = PyOS_double_to_string(val, (char)type, precision, flags, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
980 &float_type); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
981 if (buf == NULL) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
982 goto done; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
983 n_digits = strlen(buf); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
984 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
985 if (add_pct) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
986 /* We know that buf has a trailing zero (since we just called |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
987 strlen() on it), and we don't use that fact any more. So we |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
988 can just write over the trailing zero. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
989 buf[n_digits] = '%'; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
990 n_digits += 1; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
991 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
992 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
993 /* Since there is no unicode version of PyOS_double_to_string, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
994 just use the 8 bit version and then convert to unicode. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
995 #if STRINGLIB_IS_UNICODE |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
996 unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_digits)*sizeof(Py_UNICODE)); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
997 if (unicode_tmp == NULL) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
998 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
999 goto done; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1000 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1001 strtounicode(unicode_tmp, buf, n_digits); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1002 p = unicode_tmp; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1003 #else |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1004 p = buf; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1005 #endif |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1006 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1007 /* Is a sign character present in the output? If so, remember it |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1008 and skip it */ |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1009 if (*p == '-') { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1010 sign_char = *p; |
|
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:
45382
diff
changeset
|
1011 ++p; |
|
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:
45382
diff
changeset
|
1012 --n_digits; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1013 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1014 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1015 /* Determine if we have any "remainder" (after the digits, might include |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1016 decimal or exponent or both (or neither)) */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1017 parse_number(p, n_digits, &n_remainder, &has_decimal); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1018 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1019 /* Determine the grouping, separator, and decimal point, if any. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1020 get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE : |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1021 (format->thousands_separators ? |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1022 LT_DEFAULT_LOCALE : |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1023 LT_NO_LOCALE), |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1024 &locale); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1025 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1026 /* Calculate how much memory we'll need. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1027 n_total = calc_number_widths(&spec, 0, sign_char, p, n_digits, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1028 n_remainder, has_decimal, &locale, format); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1029 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1030 /* Allocate the memory. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1031 result = STRINGLIB_NEW(NULL, n_total); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1032 if (result == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1033 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1034 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1035 /* Populate the memory. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1036 fill_number(STRINGLIB_STR(result), &spec, p, n_digits, NULL, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1037 format->fill_char == '\0' ? ' ' : format->fill_char, &locale, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1038 0); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1039 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1040 done: |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1041 PyMem_Free(buf); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1042 #if STRINGLIB_IS_UNICODE |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1043 PyMem_Free(unicode_tmp); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1044 #endif |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1045 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1046 } |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1047 #endif /* FORMAT_FLOAT */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1048 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1049 /************************************************************************/ |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1050 /*********** complex formatting *****************************************/ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1051 /************************************************************************/ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1052 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1053 #ifdef FORMAT_COMPLEX |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1054 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1055 static PyObject * |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1056 format_complex_internal(PyObject *value, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1057 const InternalFormatSpec *format) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1058 { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1059 double re; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1060 double im; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1061 char *re_buf = NULL; /* buffer returned from PyOS_double_to_string */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1062 char *im_buf = NULL; /* buffer returned from PyOS_double_to_string */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1063 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1064 InternalFormatSpec tmp_format = *format; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1065 Py_ssize_t n_re_digits; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1066 Py_ssize_t n_im_digits; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1067 Py_ssize_t n_re_remainder; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1068 Py_ssize_t n_im_remainder; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1069 Py_ssize_t n_re_total; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1070 Py_ssize_t n_im_total; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1071 int re_has_decimal; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1072 int im_has_decimal; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1073 Py_ssize_t precision = format->precision; |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53665
diff
changeset
|
1074 Py_ssize_t default_precision = 6; |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1075 STRINGLIB_CHAR type = format->type; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1076 STRINGLIB_CHAR *p_re; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1077 STRINGLIB_CHAR *p_im; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1078 NumberFieldWidths re_spec; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1079 NumberFieldWidths im_spec; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1080 int flags = 0; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1081 PyObject *result = NULL; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1082 STRINGLIB_CHAR *p; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1083 STRINGLIB_CHAR re_sign_char = '\0'; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1084 STRINGLIB_CHAR im_sign_char = '\0'; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1085 int re_float_type; /* Used to see if we have a nan, inf, or regular float. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1086 int im_float_type; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1087 int add_parens = 0; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1088 int skip_re = 0; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1089 Py_ssize_t lpad; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1090 Py_ssize_t rpad; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1091 Py_ssize_t total; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1092 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1093 #if STRINGLIB_IS_UNICODE |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1094 Py_UNICODE *re_unicode_tmp = NULL; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1095 Py_UNICODE *im_unicode_tmp = NULL; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1096 #endif |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1097 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1098 /* Locale settings, either from the actual locale or |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1099 from a hard-code pseudo-locale */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1100 LocaleInfo locale; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1101 |
|
66444
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
63750
diff
changeset
|
1102 /* Zero padding is not allowed. */ |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1103 if (format->fill_char == '0') { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1104 PyErr_SetString(PyExc_ValueError, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1105 "Zero padding is not allowed in complex format " |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1106 "specifier"); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1107 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1108 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1109 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1110 /* Neither is '=' alignment . */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1111 if (format->align == '=') { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1112 PyErr_SetString(PyExc_ValueError, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1113 "'=' alignment flag is not allowed in complex format " |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1114 "specifier"); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1115 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1116 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1117 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1118 re = PyComplex_RealAsDouble(value); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1119 if (re == -1.0 && PyErr_Occurred()) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1120 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1121 im = PyComplex_ImagAsDouble(value); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1122 if (im == -1.0 && PyErr_Occurred()) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1123 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1124 |
|
66444
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
63750
diff
changeset
|
1125 if (format->alternate) |
|
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
63750
diff
changeset
|
1126 flags |= Py_DTSF_ALT; |
|
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
63750
diff
changeset
|
1127 |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1128 if (type == '\0') { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1129 /* Omitted type specifier. Should be like str(self). */ |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
1130 type = 'r'; |
|
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
1131 default_precision = 0; |
|
63417
398fa7b7753a
Merged revisions 83400 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
59046
diff
changeset
|
1132 if (re == 0.0 && copysign(1.0, re) == 1.0) |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1133 skip_re = 1; |
|
63417
398fa7b7753a
Merged revisions 83400 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
59046
diff
changeset
|
1134 else |
|
398fa7b7753a
Merged revisions 83400 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
59046
diff
changeset
|
1135 add_parens = 1; |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1136 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1137 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1138 if (type == 'n') |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1139 /* 'n' is the same as 'g', except for the locale used to |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1140 format the result. We take care of that later. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1141 type = 'g'; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1142 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1143 if (precision < 0) |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53665
diff
changeset
|
1144 precision = default_precision; |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
1145 else if (type == 'r') |
|
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
63416
diff
changeset
|
1146 type = 'g'; |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1147 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1148 /* Cast "type", because if we're in unicode we need to pass a |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1149 8-bit char. This is safe, because we've restricted what "type" |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1150 can be. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1151 re_buf = PyOS_double_to_string(re, (char)type, precision, flags, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1152 &re_float_type); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1153 if (re_buf == NULL) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1154 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1155 im_buf = PyOS_double_to_string(im, (char)type, precision, flags, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1156 &im_float_type); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1157 if (im_buf == NULL) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1158 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1159 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1160 n_re_digits = strlen(re_buf); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1161 n_im_digits = strlen(im_buf); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1162 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1163 /* Since there is no unicode version of PyOS_double_to_string, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1164 just use the 8 bit version and then convert to unicode. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1165 #if STRINGLIB_IS_UNICODE |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1166 re_unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_re_digits)*sizeof(Py_UNICODE)); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1167 if (re_unicode_tmp == NULL) { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1168 PyErr_NoMemory(); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1169 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1170 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1171 strtounicode(re_unicode_tmp, re_buf, n_re_digits); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1172 p_re = re_unicode_tmp; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1173 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1174 im_unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_im_digits)*sizeof(Py_UNICODE)); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1175 if (im_unicode_tmp == NULL) { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1176 PyErr_NoMemory(); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1177 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1178 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1179 strtounicode(im_unicode_tmp, im_buf, n_im_digits); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1180 p_im = im_unicode_tmp; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1181 #else |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1182 p_re = re_buf; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1183 p_im = im_buf; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1184 #endif |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1185 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1186 /* Is a sign character present in the output? If so, remember it |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1187 and skip it */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1188 if (*p_re == '-') { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1189 re_sign_char = *p_re; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1190 ++p_re; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1191 --n_re_digits; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1192 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1193 if (*p_im == '-') { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1194 im_sign_char = *p_im; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1195 ++p_im; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1196 --n_im_digits; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1197 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1198 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1199 /* Determine if we have any "remainder" (after the digits, might include |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1200 decimal or exponent or both (or neither)) */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1201 parse_number(p_re, n_re_digits, &n_re_remainder, &re_has_decimal); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1202 parse_number(p_im, n_im_digits, &n_im_remainder, &im_has_decimal); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1203 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1204 /* Determine the grouping, separator, and decimal point, if any. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1205 get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE : |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1206 (format->thousands_separators ? |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1207 LT_DEFAULT_LOCALE : |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1208 LT_NO_LOCALE), |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1209 &locale); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1210 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1211 /* Turn off any padding. We'll do it later after we've composed |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1212 the numbers without padding. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1213 tmp_format.fill_char = '\0'; |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
1214 tmp_format.align = '<'; |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1215 tmp_format.width = -1; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1216 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1217 /* Calculate how much memory we'll need. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1218 n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, p_re, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1219 n_re_digits, n_re_remainder, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1220 re_has_decimal, &locale, &tmp_format); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1221 |
|
63417
398fa7b7753a
Merged revisions 83400 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
59046
diff
changeset
|
1222 /* Same formatting, but always include a sign, unless the real part is |
|
398fa7b7753a
Merged revisions 83400 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
59046
diff
changeset
|
1223 * going to be omitted, in which case we use whatever sign convention was |
|
398fa7b7753a
Merged revisions 83400 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
59046
diff
changeset
|
1224 * requested by the original format. */ |
|
398fa7b7753a
Merged revisions 83400 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
59046
diff
changeset
|
1225 if (!skip_re) |
|
398fa7b7753a
Merged revisions 83400 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
59046
diff
changeset
|
1226 tmp_format.sign = '+'; |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1227 n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, p_im, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1228 n_im_digits, n_im_remainder, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1229 im_has_decimal, &locale, &tmp_format); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1230 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1231 if (skip_re) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1232 n_re_total = 0; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1233 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1234 /* Add 1 for the 'j', and optionally 2 for parens. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1235 calc_padding(n_re_total + n_im_total + 1 + add_parens * 2, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1236 format->width, format->align, &lpad, &rpad, &total); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1237 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1238 result = STRINGLIB_NEW(NULL, total); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1239 if (result == NULL) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1240 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1241 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1242 /* Populate the memory. First, the padding. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1243 p = fill_padding(STRINGLIB_STR(result), |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1244 n_re_total + n_im_total + 1 + add_parens * 2, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1245 format->fill_char=='\0' ? ' ' : format->fill_char, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1246 lpad, rpad); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1247 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1248 if (add_parens) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1249 *p++ = '('; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1250 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1251 if (!skip_re) { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1252 fill_number(p, &re_spec, p_re, n_re_digits, NULL, 0, &locale, 0); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1253 p += n_re_total; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1254 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1255 fill_number(p, &im_spec, p_im, n_im_digits, NULL, 0, &locale, 0); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1256 p += n_im_total; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1257 *p++ = 'j'; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1258 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1259 if (add_parens) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1260 *p++ = ')'; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1261 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1262 done: |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1263 PyMem_Free(re_buf); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1264 PyMem_Free(im_buf); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1265 #if STRINGLIB_IS_UNICODE |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1266 PyMem_Free(re_unicode_tmp); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1267 PyMem_Free(im_unicode_tmp); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1268 #endif |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1269 return result; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1270 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1271 #endif /* FORMAT_COMPLEX */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1272 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1273 /************************************************************************/ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1274 /*********** built in formatters ****************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1275 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1276 PyObject * |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1277 FORMAT_STRING(PyObject *obj, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1278 STRINGLIB_CHAR *format_spec, |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1279 Py_ssize_t format_spec_len) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1280 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1281 InternalFormatSpec format; |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1282 PyObject *result = NULL; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1283 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1284 /* check for the special case of zero length format spec, make |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1285 it equivalent to str(obj) */ |
|
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1286 if (format_spec_len == 0) { |
|
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1287 result = STRINGLIB_TOSTR(obj); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1288 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1289 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1290 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1291 /* parse the format_spec */ |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1292 if (!parse_internal_render_format_spec(format_spec, format_spec_len, |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
1293 &format, 's', '<')) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1294 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1295 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1296 /* type conversion? */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1297 switch (format.type) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1298 case 's': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1299 /* no type conversion needed, already a string. do the formatting */ |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1300 result = format_string_internal(obj, &format); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1301 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1302 default: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1303 /* unknown */ |
|
51758
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
1304 unknown_presentation_type(format.type, obj->ob_type->tp_name); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1305 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1306 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1307 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1308 done: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1309 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1310 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1311 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1312 #if defined FORMAT_LONG || defined FORMAT_INT |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1313 static PyObject* |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1314 format_int_or_long(PyObject* obj, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1315 STRINGLIB_CHAR *format_spec, |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1316 Py_ssize_t format_spec_len, |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1317 IntOrLongToString tostring) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1318 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1319 PyObject *result = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1320 PyObject *tmp = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1321 InternalFormatSpec format; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1322 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1323 /* check for the special case of zero length format spec, make |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1324 it equivalent to str(obj) */ |
|
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1325 if (format_spec_len == 0) { |
|
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1326 result = STRINGLIB_TOSTR(obj); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1327 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1328 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1329 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1330 /* parse the format_spec */ |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1331 if (!parse_internal_render_format_spec(format_spec, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1332 format_spec_len, |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
1333 &format, 'd', '>')) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1334 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1335 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1336 /* type conversion? */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1337 switch (format.type) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1338 case 'b': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1339 case 'c': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1340 case 'd': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1341 case 'o': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1342 case 'x': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1343 case 'X': |
|
46909
ef4ec968fdb6
Merged revisions 63078 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
46335
diff
changeset
|
1344 case 'n': |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1345 /* no type conversion needed, already an int (or long). do |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1346 the formatting */ |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1347 result = format_int_or_long_internal(obj, &format, tostring); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1348 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1349 |
|
45032
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1350 case 'e': |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1351 case 'E': |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1352 case 'f': |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1353 case 'F': |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1354 case 'g': |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1355 case 'G': |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1356 case '%': |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1357 /* convert to float */ |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1358 tmp = PyNumber_Float(obj); |
|
45032
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1359 if (tmp == NULL) |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1360 goto done; |
|
53117
5472789651e1
Merged revisions 71548 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
52842
diff
changeset
|
1361 result = format_float_internal(tmp, &format); |
|
45032
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1362 break; |
|
a28d0b14b77d
Partially revert r60376: restore ability for ints to be automatically converted to floats, if a float type specifier is given to an int. PEP 3101 should be clarified on this point.Also, remove unused local variables left over from r60376.
Eric Smith <eric@trueblade.com>
parents:
45023
diff
changeset
|
1363 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1364 default: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1365 /* unknown */ |
|
51758
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
1366 unknown_presentation_type(format.type, obj->ob_type->tp_name); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1367 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1368 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1369 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1370 done: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1371 Py_XDECREF(tmp); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1372 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1373 } |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1374 #endif /* FORMAT_LONG || defined FORMAT_INT */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1375 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1376 #ifdef FORMAT_LONG |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1377 /* Need to define long_format as a function that will convert a long |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1378 to a string. In 3.0, _PyLong_Format has the correct signature. In |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1379 2.x, we need to fudge a few parameters */ |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1380 #if PY_VERSION_HEX >= 0x03000000 |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1381 #define long_format _PyLong_Format |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1382 #else |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1383 static PyObject* |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1384 long_format(PyObject* value, int base) |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1385 { |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1386 /* Convert to base, don't add trailing 'L', and use the new octal |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1387 format. We already know this is a long object */ |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1388 assert(PyLong_Check(value)); |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1389 /* convert to base, don't add 'L', and use the new octal format */ |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1390 return _PyLong_Format(value, base, 0, 1); |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1391 } |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1392 #endif |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1393 |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1394 PyObject * |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1395 FORMAT_LONG(PyObject *obj, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1396 STRINGLIB_CHAR *format_spec, |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1397 Py_ssize_t format_spec_len) |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1398 { |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1399 return format_int_or_long(obj, format_spec, format_spec_len, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1400 long_format); |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1401 } |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1402 #endif /* FORMAT_LONG */ |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1403 |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1404 #ifdef FORMAT_INT |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1405 /* this is only used for 2.x, not 3.0 */ |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1406 static PyObject* |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1407 int_format(PyObject* value, int base) |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1408 { |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1409 /* Convert to base, and use the new octal format. We already |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1410 know this is an int object */ |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1411 assert(PyInt_Check(value)); |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1412 return _PyInt_Format((PyIntObject*)value, base, 1); |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1413 } |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1414 |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1415 PyObject * |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1416 FORMAT_INT(PyObject *obj, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1417 STRINGLIB_CHAR *format_spec, |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1418 Py_ssize_t format_spec_len) |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1419 { |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1420 return format_int_or_long(obj, format_spec, format_spec_len, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1421 int_format); |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1422 } |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1423 #endif /* FORMAT_INT */ |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1424 |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1425 #ifdef FORMAT_FLOAT |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1426 PyObject * |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1427 FORMAT_FLOAT(PyObject *obj, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1428 STRINGLIB_CHAR *format_spec, |
|
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1429 Py_ssize_t format_spec_len) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1430 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1431 PyObject *result = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1432 InternalFormatSpec format; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1433 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1434 /* check for the special case of zero length format spec, make |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1435 it equivalent to str(obj) */ |
|
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1436 if (format_spec_len == 0) { |
|
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1437 result = STRINGLIB_TOSTR(obj); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1438 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1439 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1440 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1441 /* parse the format_spec */ |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1442 if (!parse_internal_render_format_spec(format_spec, |
|
52772
a98091066e01
Removed mixed tabs and whitespace.
Eric Smith <eric@trueblade.com>
parents:
52407
diff
changeset
|
1443 format_spec_len, |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
1444 &format, '\0', '>')) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1445 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1446 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1447 /* type conversion? */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1448 switch (format.type) { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53117
diff
changeset
|
1449 case '\0': /* No format code: like 'g', but with at least one decimal. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1450 case 'e': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1451 case 'E': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1452 case 'f': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1453 case 'F': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1454 case 'g': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1455 case 'G': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1456 case 'n': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1457 case '%': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1458 /* no conversion, already a float. do the formatting */ |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
1459 result = format_float_internal(obj, &format); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1460 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1461 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1462 default: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1463 /* unknown */ |
|
51758
4d3baac2e1a2
Merged revisions 69808 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
48848
diff
changeset
|
1464 unknown_presentation_type(format.type, obj->ob_type->tp_name); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1465 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1466 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1467 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1468 done: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1469 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1470 } |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
45032
diff
changeset
|
1471 #endif /* FORMAT_FLOAT */ |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1472 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1473 #ifdef FORMAT_COMPLEX |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1474 PyObject * |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1475 FORMAT_COMPLEX(PyObject *obj, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1476 STRINGLIB_CHAR *format_spec, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1477 Py_ssize_t format_spec_len) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1478 { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1479 PyObject *result = NULL; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1480 InternalFormatSpec format; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1481 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1482 /* check for the special case of zero length format spec, make |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1483 it equivalent to str(obj) */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1484 if (format_spec_len == 0) { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1485 result = STRINGLIB_TOSTR(obj); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1486 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1487 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1488 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1489 /* parse the format_spec */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1490 if (!parse_internal_render_format_spec(format_spec, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1491 format_spec_len, |
|
59028
73cd83706bc4
Merged revisions 78333 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
55463
diff
changeset
|
1492 &format, '\0', '>')) |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1493 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1494 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1495 /* type conversion? */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1496 switch (format.type) { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1497 case '\0': /* No format code: like 'g', but with at least one decimal. */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1498 case 'e': |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1499 case 'E': |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1500 case 'f': |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1501 case 'F': |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1502 case 'g': |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1503 case 'G': |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1504 case 'n': |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1505 /* no conversion, already a complex. do the formatting */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1506 result = format_complex_internal(obj, &format); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1507 break; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1508 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1509 default: |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1510 /* unknown */ |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1511 unknown_presentation_type(format.type, obj->ob_type->tp_name); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1512 goto done; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1513 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1514 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1515 done: |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1516 return result; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1517 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53320
diff
changeset
|
1518 #endif /* FORMAT_COMPLEX */ |
