blob: 6b282249b1797110a149467952a91a9f6a83a14c [file] [log] [blame]
Eric Smitha9f7d622008-02-17 19:46:49 +00001/* implements the string, long, and float formatters. that is,
2 string.__format__, etc. */
3
Eric Smithaca19e62009-04-22 13:29:05 +00004#include <locale.h>
5
Eric Smitha9f7d622008-02-17 19:46:49 +00006/* Before including this, you must include either:
7 stringlib/unicodedefs.h
8 stringlib/stringdefs.h
9
10 Also, you should define the names:
11 FORMAT_STRING
12 FORMAT_LONG
13 FORMAT_FLOAT
Eric Smith9139cc62009-04-30 00:58:58 +000014 FORMAT_COMPLEX
Eric Smitha9f7d622008-02-17 19:46:49 +000015 to be whatever you want the public names of these functions to
16 be. These are the only non-static functions defined here.
17*/
18
Eric Smithe9fb6862009-02-20 14:02:36 +000019/* Raises an exception about an unknown presentation type for this
20 * type. */
21
22static void
23unknown_presentation_type(STRINGLIB_CHAR presentation_type,
24 const char* type_name)
25{
26#if STRINGLIB_IS_UNICODE
27 /* If STRINGLIB_CHAR is Py_UNICODE, %c might be out-of-range,
28 hence the two cases. If it is char, gcc complains that the
29 condition below is always true, hence the ifdef. */
30 if (presentation_type > 32 && presentation_type < 128)
31#endif
32 PyErr_Format(PyExc_ValueError,
33 "Unknown format code '%c' "
34 "for object of type '%.200s'",
Eric Smith5c4a5d22009-07-30 13:39:44 +000035 (char)presentation_type,
Eric Smithe9fb6862009-02-20 14:02:36 +000036 type_name);
37#if STRINGLIB_IS_UNICODE
38 else
39 PyErr_Format(PyExc_ValueError,
40 "Unknown format code '\\x%x' "
41 "for object of type '%.200s'",
42 (unsigned int)presentation_type,
43 type_name);
44#endif
45}
46
Eric Smith5c4a5d22009-07-30 13:39:44 +000047static void
48invalid_comma_type(STRINGLIB_CHAR presentation_type)
49{
50#if STRINGLIB_IS_UNICODE
51 /* See comment in unknown_presentation_type */
52 if (presentation_type > 32 && presentation_type < 128)
53#endif
54 PyErr_Format(PyExc_ValueError,
55 "Cannot specify ',' with '%c'.",
56 (char)presentation_type);
57#if STRINGLIB_IS_UNICODE
58 else
59 PyErr_Format(PyExc_ValueError,
60 "Cannot specify ',' with '\\x%x'.",
61 (unsigned int)presentation_type);
62#endif
63}
64
Eric Smitha9f7d622008-02-17 19:46:49 +000065/*
66 get_integer consumes 0 or more decimal digit characters from an
67 input string, updates *result with the corresponding positive
68 integer, and returns the number of digits consumed.
69
70 returns -1 on error.
71*/
72static int
73get_integer(STRINGLIB_CHAR **ptr, STRINGLIB_CHAR *end,
74 Py_ssize_t *result)
75{
Mark Dickinson75d36002012-10-28 10:00:46 +000076 Py_ssize_t accumulator, digitval;
Eric Smitha9f7d622008-02-17 19:46:49 +000077 int numdigits;
78 accumulator = numdigits = 0;
79 for (;;(*ptr)++, numdigits++) {
80 if (*ptr >= end)
81 break;
82 digitval = STRINGLIB_TODECIMAL(**ptr);
83 if (digitval < 0)
84 break;
85 /*
Mark Dickinson75d36002012-10-28 10:00:46 +000086 Detect possible overflow before it happens:
87
88 accumulator * 10 + digitval > PY_SSIZE_T_MAX if and only if
89 accumulator > (PY_SSIZE_T_MAX - digitval) / 10.
Eric Smitha9f7d622008-02-17 19:46:49 +000090 */
Mark Dickinson75d36002012-10-28 10:00:46 +000091 if (accumulator > (PY_SSIZE_T_MAX - digitval) / 10) {
Eric Smitha9f7d622008-02-17 19:46:49 +000092 PyErr_Format(PyExc_ValueError,
93 "Too many decimal digits in format string");
94 return -1;
95 }
Mark Dickinson75d36002012-10-28 10:00:46 +000096 accumulator = accumulator * 10 + digitval;
Eric Smitha9f7d622008-02-17 19:46:49 +000097 }
98 *result = accumulator;
99 return numdigits;
100}
101
102/************************************************************************/
103/*********** standard format specifier parsing **************************/
104/************************************************************************/
105
106/* returns true if this character is a specifier alignment token */
107Py_LOCAL_INLINE(int)
108is_alignment_token(STRINGLIB_CHAR c)
109{
110 switch (c) {
111 case '<': case '>': case '=': case '^':
112 return 1;
113 default:
114 return 0;
115 }
116}
117
118/* returns true if this character is a sign element */
119Py_LOCAL_INLINE(int)
120is_sign_element(STRINGLIB_CHAR c)
121{
122 switch (c) {
123 case ' ': case '+': case '-':
Eric Smitha9f7d622008-02-17 19:46:49 +0000124 return 1;
125 default:
126 return 0;
127 }
128}
129
130
131typedef struct {
132 STRINGLIB_CHAR fill_char;
133 STRINGLIB_CHAR align;
Eric Smithd0c84122008-07-15 10:10:07 +0000134 int alternate;
Eric Smitha9f7d622008-02-17 19:46:49 +0000135 STRINGLIB_CHAR sign;
136 Py_ssize_t width;
Eric Smithaca19e62009-04-22 13:29:05 +0000137 int thousands_separators;
Eric Smitha9f7d622008-02-17 19:46:49 +0000138 Py_ssize_t precision;
139 STRINGLIB_CHAR type;
140} InternalFormatSpec;
141
Eric Smithf32d4ac2010-02-22 18:33:47 +0000142
143#if 0
144/* Occassionally useful for debugging. Should normally be commented out. */
145static void
146DEBUG_PRINT_FORMAT_SPEC(InternalFormatSpec *format)
147{
148 printf("internal format spec: fill_char %d\n", format->fill_char);
149 printf("internal format spec: align %d\n", format->align);
150 printf("internal format spec: alternate %d\n", format->alternate);
151 printf("internal format spec: sign %d\n", format->sign);
Eric Smith87bcb242010-02-23 00:11:16 +0000152 printf("internal format spec: width %zd\n", format->width);
Eric Smithf32d4ac2010-02-22 18:33:47 +0000153 printf("internal format spec: thousands_separators %d\n",
154 format->thousands_separators);
Eric Smith87bcb242010-02-23 00:11:16 +0000155 printf("internal format spec: precision %zd\n", format->precision);
Eric Smithf32d4ac2010-02-22 18:33:47 +0000156 printf("internal format spec: type %c\n", format->type);
157 printf("\n");
158}
159#endif
160
161
Eric Smitha9f7d622008-02-17 19:46:49 +0000162/*
163 ptr points to the start of the format_spec, end points just past its end.
164 fills in format with the parsed information.
165 returns 1 on success, 0 on failure.
166 if failure, sets the exception
167*/
168static int
Eric Smithdc13b792008-05-30 18:10:04 +0000169parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec,
Eric Smithaca19e62009-04-22 13:29:05 +0000170 Py_ssize_t format_spec_len,
Eric Smitha9f7d622008-02-17 19:46:49 +0000171 InternalFormatSpec *format,
Eric Smithf32d4ac2010-02-22 18:33:47 +0000172 char default_type,
173 char default_align)
Eric Smitha9f7d622008-02-17 19:46:49 +0000174{
Eric Smithdc13b792008-05-30 18:10:04 +0000175 STRINGLIB_CHAR *ptr = format_spec;
176 STRINGLIB_CHAR *end = format_spec + format_spec_len;
Eric Smitha9f7d622008-02-17 19:46:49 +0000177
178 /* end-ptr is used throughout this code to specify the length of
179 the input string */
180
Eric Smithaca19e62009-04-22 13:29:05 +0000181 Py_ssize_t consumed;
Eric Smith87bcb242010-02-23 00:11:16 +0000182 int align_specified = 0;
Eric Smitha9f7d622008-02-17 19:46:49 +0000183
184 format->fill_char = '\0';
Eric Smithf32d4ac2010-02-22 18:33:47 +0000185 format->align = default_align;
Eric Smithd0c84122008-07-15 10:10:07 +0000186 format->alternate = 0;
Eric Smitha9f7d622008-02-17 19:46:49 +0000187 format->sign = '\0';
188 format->width = -1;
Eric Smithaca19e62009-04-22 13:29:05 +0000189 format->thousands_separators = 0;
Eric Smitha9f7d622008-02-17 19:46:49 +0000190 format->precision = -1;
191 format->type = default_type;
192
193 /* If the second char is an alignment token,
194 then parse the fill char */
195 if (end-ptr >= 2 && is_alignment_token(ptr[1])) {
196 format->align = ptr[1];
197 format->fill_char = ptr[0];
Eric Smith87bcb242010-02-23 00:11:16 +0000198 align_specified = 1;
Eric Smitha9f7d622008-02-17 19:46:49 +0000199 ptr += 2;
200 }
201 else if (end-ptr >= 1 && is_alignment_token(ptr[0])) {
202 format->align = ptr[0];
Eric Smith87bcb242010-02-23 00:11:16 +0000203 align_specified = 1;
Eric Smith8a803dd2008-02-20 23:39:28 +0000204 ++ptr;
Eric Smitha9f7d622008-02-17 19:46:49 +0000205 }
206
207 /* Parse the various sign options */
208 if (end-ptr >= 1 && is_sign_element(ptr[0])) {
209 format->sign = ptr[0];
Eric Smith8a803dd2008-02-20 23:39:28 +0000210 ++ptr;
Eric Smitha9f7d622008-02-17 19:46:49 +0000211 }
212
Eric Smitha5fa5a22008-07-16 00:11:49 +0000213 /* If the next character is #, we're in alternate mode. This only
214 applies to integers. */
215 if (end-ptr >= 1 && ptr[0] == '#') {
Eric Smithaca19e62009-04-22 13:29:05 +0000216 format->alternate = 1;
217 ++ptr;
Eric Smitha5fa5a22008-07-16 00:11:49 +0000218 }
219
Eric Smitha9f7d622008-02-17 19:46:49 +0000220 /* The special case for 0-padding (backwards compat) */
221 if (format->fill_char == '\0' && end-ptr >= 1 && ptr[0] == '0') {
222 format->fill_char = '0';
Eric Smith87bcb242010-02-23 00:11:16 +0000223 if (!align_specified) {
Eric Smitha9f7d622008-02-17 19:46:49 +0000224 format->align = '=';
225 }
Eric Smith8a803dd2008-02-20 23:39:28 +0000226 ++ptr;
Eric Smitha9f7d622008-02-17 19:46:49 +0000227 }
228
Eric Smithaca19e62009-04-22 13:29:05 +0000229 consumed = get_integer(&ptr, end, &format->width);
230 if (consumed == -1)
231 /* Overflow error. Exception already set. */
232 return 0;
Eric Smitha9f7d622008-02-17 19:46:49 +0000233
Eric Smithaca19e62009-04-22 13:29:05 +0000234 /* If consumed is 0, we didn't consume any characters for the
235 width. In that case, reset the width to -1, because
236 get_integer() will have set it to zero. -1 is how we record
237 that the width wasn't specified. */
238 if (consumed == 0)
Eric Smitha9f7d622008-02-17 19:46:49 +0000239 format->width = -1;
Eric Smithaca19e62009-04-22 13:29:05 +0000240
241 /* Comma signifies add thousands separators */
242 if (end-ptr && ptr[0] == ',') {
243 format->thousands_separators = 1;
244 ++ptr;
Eric Smitha9f7d622008-02-17 19:46:49 +0000245 }
246
247 /* Parse field precision */
248 if (end-ptr && ptr[0] == '.') {
Eric Smith8a803dd2008-02-20 23:39:28 +0000249 ++ptr;
Eric Smitha9f7d622008-02-17 19:46:49 +0000250
Eric Smithaca19e62009-04-22 13:29:05 +0000251 consumed = get_integer(&ptr, end, &format->precision);
252 if (consumed == -1)
253 /* Overflow error. Exception already set. */
254 return 0;
Eric Smitha9f7d622008-02-17 19:46:49 +0000255
Eric Smithaca19e62009-04-22 13:29:05 +0000256 /* Not having a precision after a dot is an error. */
257 if (consumed == 0) {
Eric Smitha9f7d622008-02-17 19:46:49 +0000258 PyErr_Format(PyExc_ValueError,
259 "Format specifier missing precision");
260 return 0;
261 }
262
263 }
264
Eric Smithaca19e62009-04-22 13:29:05 +0000265 /* Finally, parse the type field. */
Eric Smitha9f7d622008-02-17 19:46:49 +0000266
267 if (end-ptr > 1) {
Eric Smithaca19e62009-04-22 13:29:05 +0000268 /* More than one char remain, invalid conversion spec. */
Eric Smitha9f7d622008-02-17 19:46:49 +0000269 PyErr_Format(PyExc_ValueError, "Invalid conversion specification");
270 return 0;
271 }
272
273 if (end-ptr == 1) {
274 format->type = ptr[0];
Eric Smith8a803dd2008-02-20 23:39:28 +0000275 ++ptr;
Eric Smitha9f7d622008-02-17 19:46:49 +0000276 }
277
Eric Smithaca19e62009-04-22 13:29:05 +0000278 /* Do as much validating as we can, just by looking at the format
279 specifier. Do not take into account what type of formatting
280 we're doing (int, float, string). */
281
282 if (format->thousands_separators) {
283 switch (format->type) {
284 case 'd':
285 case 'e':
286 case 'f':
287 case 'g':
288 case 'E':
289 case 'G':
290 case '%':
291 case 'F':
Eric Smithebafbb72009-04-22 16:20:47 +0000292 case '\0':
Eric Smithaca19e62009-04-22 13:29:05 +0000293 /* These are allowed. See PEP 378.*/
294 break;
295 default:
Eric Smith5c4a5d22009-07-30 13:39:44 +0000296 invalid_comma_type(format->type);
Eric Smithaca19e62009-04-22 13:29:05 +0000297 return 0;
298 }
299 }
300
Eric Smitha9f7d622008-02-17 19:46:49 +0000301 return 1;
302}
303
Eric Smith9139cc62009-04-30 00:58:58 +0000304/* Calculate the padding needed. */
305static void
306calc_padding(Py_ssize_t nchars, Py_ssize_t width, STRINGLIB_CHAR align,
307 Py_ssize_t *n_lpadding, Py_ssize_t *n_rpadding,
308 Py_ssize_t *n_total)
309{
310 if (width >= 0) {
311 if (nchars > width)
312 *n_total = nchars;
313 else
314 *n_total = width;
315 }
316 else {
317 /* not specified, use all of the chars and no more */
318 *n_total = nchars;
319 }
320
Eric Smithf32d4ac2010-02-22 18:33:47 +0000321 /* Figure out how much leading space we need, based on the
Eric Smith9139cc62009-04-30 00:58:58 +0000322 aligning */
323 if (align == '>')
324 *n_lpadding = *n_total - nchars;
325 else if (align == '^')
326 *n_lpadding = (*n_total - nchars) / 2;
Eric Smithf32d4ac2010-02-22 18:33:47 +0000327 else if (align == '<' || align == '=')
Eric Smith9139cc62009-04-30 00:58:58 +0000328 *n_lpadding = 0;
Eric Smithf32d4ac2010-02-22 18:33:47 +0000329 else {
330 /* We should never have an unspecified alignment. */
331 *n_lpadding = 0;
332 assert(0);
333 }
Eric Smith9139cc62009-04-30 00:58:58 +0000334
335 *n_rpadding = *n_total - nchars - *n_lpadding;
336}
337
338/* Do the padding, and return a pointer to where the caller-supplied
339 content goes. */
340static STRINGLIB_CHAR *
341fill_padding(STRINGLIB_CHAR *p, Py_ssize_t nchars, STRINGLIB_CHAR fill_char,
342 Py_ssize_t n_lpadding, Py_ssize_t n_rpadding)
343{
344 /* Pad on left. */
345 if (n_lpadding)
346 STRINGLIB_FILL(p, fill_char, n_lpadding);
347
348 /* Pad on right. */
349 if (n_rpadding)
350 STRINGLIB_FILL(p + nchars + n_lpadding, fill_char, n_rpadding);
351
352 /* Pointer to the user content. */
353 return p + n_lpadding;
354}
355
356#if defined FORMAT_FLOAT || defined FORMAT_LONG || defined FORMAT_COMPLEX
Eric Smitha9f7d622008-02-17 19:46:49 +0000357/************************************************************************/
358/*********** common routines for numeric formatting *********************/
359/************************************************************************/
360
Eric Smithaca19e62009-04-22 13:29:05 +0000361/* Locale type codes. */
362#define LT_CURRENT_LOCALE 0
363#define LT_DEFAULT_LOCALE 1
364#define LT_NO_LOCALE 2
365
366/* Locale info needed for formatting integers and the part of floats
367 before and including the decimal. Note that locales only support
368 8-bit chars, not unicode. */
369typedef struct {
370 char *decimal_point;
371 char *thousands_sep;
372 char *grouping;
373} LocaleInfo;
374
Eric Smitha9f7d622008-02-17 19:46:49 +0000375/* describes the layout for an integer, see the comment in
Eric Smitha5fa5a22008-07-16 00:11:49 +0000376 calc_number_widths() for details */
Eric Smitha9f7d622008-02-17 19:46:49 +0000377typedef struct {
378 Py_ssize_t n_lpadding;
Eric Smitha5fa5a22008-07-16 00:11:49 +0000379 Py_ssize_t n_prefix;
Eric Smitha9f7d622008-02-17 19:46:49 +0000380 Py_ssize_t n_spadding;
381 Py_ssize_t n_rpadding;
Eric Smithaca19e62009-04-22 13:29:05 +0000382 char sign;
383 Py_ssize_t n_sign; /* number of digits needed for sign (0/1) */
384 Py_ssize_t n_grouped_digits; /* Space taken up by the digits, including
385 any grouping chars. */
386 Py_ssize_t n_decimal; /* 0 if only an integer */
387 Py_ssize_t n_remainder; /* Digits in decimal and/or exponent part,
388 excluding the decimal itself, if
389 present. */
390
391 /* These 2 are not the widths of fields, but are needed by
392 STRINGLIB_GROUPING. */
393 Py_ssize_t n_digits; /* The number of digits before a decimal
394 or exponent. */
395 Py_ssize_t n_min_width; /* The min_width we used when we computed
396 the n_grouped_digits width. */
Eric Smitha9f7d622008-02-17 19:46:49 +0000397} NumberFieldWidths;
398
Eric Smith9139cc62009-04-30 00:58:58 +0000399
Eric Smithaca19e62009-04-22 13:29:05 +0000400/* Given a number of the form:
401 digits[remainder]
402 where ptr points to the start and end points to the end, find where
403 the integer part ends. This could be a decimal, an exponent, both,
404 or neither.
405 If a decimal point is present, set *has_decimal and increment
406 remainder beyond it.
407 Results are undefined (but shouldn't crash) for improperly
408 formatted strings.
409*/
410static void
411parse_number(STRINGLIB_CHAR *ptr, Py_ssize_t len,
412 Py_ssize_t *n_remainder, int *has_decimal)
413{
414 STRINGLIB_CHAR *end = ptr + len;
415 STRINGLIB_CHAR *remainder;
416
417 while (ptr<end && isdigit(*ptr))
418 ++ptr;
419 remainder = ptr;
420
421 /* Does remainder start with a decimal point? */
422 *has_decimal = ptr<end && *remainder == '.';
423
424 /* Skip the decimal point. */
425 if (*has_decimal)
426 remainder++;
427
428 *n_remainder = end - remainder;
429}
430
Eric Smitha9f7d622008-02-17 19:46:49 +0000431/* not all fields of format are used. for example, precision is
432 unused. should this take discrete params in order to be more clear
433 about what it does? or is passing a single format parameter easier
434 and more efficient enough to justify a little obfuscation? */
Eric Smithaca19e62009-04-22 13:29:05 +0000435static Py_ssize_t
436calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
437 STRINGLIB_CHAR sign_char, STRINGLIB_CHAR *number,
438 Py_ssize_t n_number, Py_ssize_t n_remainder,
439 int has_decimal, const LocaleInfo *locale,
440 const InternalFormatSpec *format)
Eric Smitha9f7d622008-02-17 19:46:49 +0000441{
Eric Smithaca19e62009-04-22 13:29:05 +0000442 Py_ssize_t n_non_digit_non_padding;
443 Py_ssize_t n_padding;
444
445 spec->n_digits = n_number - n_remainder - (has_decimal?1:0);
Eric Smith4cb965c2008-07-16 18:29:51 +0000446 spec->n_lpadding = 0;
Eric Smithaca19e62009-04-22 13:29:05 +0000447 spec->n_prefix = n_prefix;
448 spec->n_decimal = has_decimal ? strlen(locale->decimal_point) : 0;
449 spec->n_remainder = n_remainder;
Eric Smith4cb965c2008-07-16 18:29:51 +0000450 spec->n_spadding = 0;
451 spec->n_rpadding = 0;
Eric Smithaca19e62009-04-22 13:29:05 +0000452 spec->sign = '\0';
453 spec->n_sign = 0;
Eric Smitha9f7d622008-02-17 19:46:49 +0000454
455 /* the output will look like:
Eric Smithaca19e62009-04-22 13:29:05 +0000456 | |
457 | <lpadding> <sign> <prefix> <spadding> <grouped_digits> <decimal> <remainder> <rpadding> |
458 | |
Eric Smitha9f7d622008-02-17 19:46:49 +0000459
Eric Smithaca19e62009-04-22 13:29:05 +0000460 sign is computed from format->sign and the actual
Eric Smitha9f7d622008-02-17 19:46:49 +0000461 sign of the number
462
Eric Smithd0c84122008-07-15 10:10:07 +0000463 prefix is given (it's for the '0x' prefix)
464
Eric Smitha9f7d622008-02-17 19:46:49 +0000465 digits is already known
466
467 the total width is either given, or computed from the
468 actual digits
469
470 only one of lpadding, spadding, and rpadding can be non-zero,
471 and it's calculated from the width and other fields
472 */
473
474 /* compute the various parts we're going to write */
Eric Smithaca19e62009-04-22 13:29:05 +0000475 switch (format->sign) {
476 case '+':
Eric Smitha9f7d622008-02-17 19:46:49 +0000477 /* always put a + or - */
Eric Smithaca19e62009-04-22 13:29:05 +0000478 spec->n_sign = 1;
479 spec->sign = (sign_char == '-' ? '-' : '+');
480 break;
481 case ' ':
482 spec->n_sign = 1;
483 spec->sign = (sign_char == '-' ? '-' : ' ');
484 break;
485 default:
486 /* Not specified, or the default (-) */
487 if (sign_char == '-') {
488 spec->n_sign = 1;
489 spec->sign = '-';
Eric Smitha9f7d622008-02-17 19:46:49 +0000490 }
491 }
492
Eric Smithaca19e62009-04-22 13:29:05 +0000493 /* The number of chars used for non-digits and non-padding. */
494 n_non_digit_non_padding = spec->n_sign + spec->n_prefix + spec->n_decimal +
495 spec->n_remainder;
Eric Smitha5fa5a22008-07-16 00:11:49 +0000496
Eric Smithaca19e62009-04-22 13:29:05 +0000497 /* min_width can go negative, that's okay. format->width == -1 means
498 we don't care. */
Eric Smith87bcb242010-02-23 00:11:16 +0000499 if (format->fill_char == '0' && format->align == '=')
Eric Smithaca19e62009-04-22 13:29:05 +0000500 spec->n_min_width = format->width - n_non_digit_non_padding;
501 else
502 spec->n_min_width = 0;
503
504 if (spec->n_digits == 0)
505 /* This case only occurs when using 'c' formatting, we need
506 to special case it because the grouping code always wants
507 to have at least one character. */
508 spec->n_grouped_digits = 0;
509 else
510 spec->n_grouped_digits = STRINGLIB_GROUPING(NULL, 0, NULL,
511 spec->n_digits,
512 spec->n_min_width,
513 locale->grouping,
514 locale->thousands_sep);
515
516 /* Given the desired width and the total of digit and non-digit
517 space we consume, see if we need any padding. format->width can
518 be negative (meaning no padding), but this code still works in
519 that case. */
520 n_padding = format->width -
521 (n_non_digit_non_padding + spec->n_grouped_digits);
522 if (n_padding > 0) {
523 /* Some padding is needed. Determine if it's left, space, or right. */
524 switch (format->align) {
525 case '<':
526 spec->n_rpadding = n_padding;
527 break;
528 case '^':
529 spec->n_lpadding = n_padding / 2;
530 spec->n_rpadding = n_padding - spec->n_lpadding;
531 break;
532 case '=':
533 spec->n_spadding = n_padding;
534 break;
Eric Smithf32d4ac2010-02-22 18:33:47 +0000535 case '>':
Eric Smithaca19e62009-04-22 13:29:05 +0000536 spec->n_lpadding = n_padding;
537 break;
Eric Smithf32d4ac2010-02-22 18:33:47 +0000538 default:
539 /* Shouldn't get here, but treat it as '>' */
540 spec->n_lpadding = n_padding;
541 assert(0);
542 break;
Eric Smitha9f7d622008-02-17 19:46:49 +0000543 }
544 }
Eric Smithaca19e62009-04-22 13:29:05 +0000545 return spec->n_lpadding + spec->n_sign + spec->n_prefix +
546 spec->n_spadding + spec->n_grouped_digits + spec->n_decimal +
547 spec->n_remainder + spec->n_rpadding;
Eric Smitha9f7d622008-02-17 19:46:49 +0000548}
549
Eric Smithaca19e62009-04-22 13:29:05 +0000550/* Fill in the digit parts of a numbers's string representation,
551 as determined in calc_number_widths().
552 No error checking, since we know the buffer is the correct size. */
553static void
554fill_number(STRINGLIB_CHAR *buf, const NumberFieldWidths *spec,
555 STRINGLIB_CHAR *digits, Py_ssize_t n_digits,
556 STRINGLIB_CHAR *prefix, STRINGLIB_CHAR fill_char,
557 LocaleInfo *locale, int toupper)
Eric Smitha9f7d622008-02-17 19:46:49 +0000558{
Eric Smithaca19e62009-04-22 13:29:05 +0000559 /* Used to keep track of digits, decimal, and remainder. */
560 STRINGLIB_CHAR *p = digits;
561
562#ifndef NDEBUG
563 Py_ssize_t r;
564#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000565
566 if (spec->n_lpadding) {
Eric Smithaca19e62009-04-22 13:29:05 +0000567 STRINGLIB_FILL(buf, fill_char, spec->n_lpadding);
568 buf += spec->n_lpadding;
Eric Smitha9f7d622008-02-17 19:46:49 +0000569 }
Eric Smithaca19e62009-04-22 13:29:05 +0000570 if (spec->n_sign == 1) {
571 *buf++ = spec->sign;
Eric Smitha9f7d622008-02-17 19:46:49 +0000572 }
Eric Smitha5fa5a22008-07-16 00:11:49 +0000573 if (spec->n_prefix) {
Eric Smithaca19e62009-04-22 13:29:05 +0000574 memmove(buf,
575 prefix,
576 spec->n_prefix * sizeof(STRINGLIB_CHAR));
577 if (toupper) {
578 Py_ssize_t t;
579 for (t = 0; t < spec->n_prefix; ++t)
580 buf[t] = STRINGLIB_TOUPPER(buf[t]);
581 }
582 buf += spec->n_prefix;
Eric Smitha5fa5a22008-07-16 00:11:49 +0000583 }
Eric Smitha9f7d622008-02-17 19:46:49 +0000584 if (spec->n_spadding) {
Eric Smithaca19e62009-04-22 13:29:05 +0000585 STRINGLIB_FILL(buf, fill_char, spec->n_spadding);
586 buf += spec->n_spadding;
Eric Smitha9f7d622008-02-17 19:46:49 +0000587 }
Eric Smithaca19e62009-04-22 13:29:05 +0000588
589 /* Only for type 'c' special case, it has no digits. */
590 if (spec->n_digits != 0) {
591 /* Fill the digits with InsertThousandsGrouping. */
592#ifndef NDEBUG
593 r =
594#endif
595 STRINGLIB_GROUPING(buf, spec->n_grouped_digits, digits,
596 spec->n_digits, spec->n_min_width,
597 locale->grouping, locale->thousands_sep);
598#ifndef NDEBUG
599 assert(r == spec->n_grouped_digits);
600#endif
601 p += spec->n_digits;
Eric Smitha9f7d622008-02-17 19:46:49 +0000602 }
Eric Smithaca19e62009-04-22 13:29:05 +0000603 if (toupper) {
604 Py_ssize_t t;
605 for (t = 0; t < spec->n_grouped_digits; ++t)
606 buf[t] = STRINGLIB_TOUPPER(buf[t]);
607 }
608 buf += spec->n_grouped_digits;
609
610 if (spec->n_decimal) {
611 Py_ssize_t t;
612 for (t = 0; t < spec->n_decimal; ++t)
613 buf[t] = locale->decimal_point[t];
614 buf += spec->n_decimal;
615 p += 1;
616 }
617
618 if (spec->n_remainder) {
619 memcpy(buf, p, spec->n_remainder * sizeof(STRINGLIB_CHAR));
620 buf += spec->n_remainder;
621 p += spec->n_remainder;
622 }
623
Eric Smitha9f7d622008-02-17 19:46:49 +0000624 if (spec->n_rpadding) {
Eric Smithaca19e62009-04-22 13:29:05 +0000625 STRINGLIB_FILL(buf, fill_char, spec->n_rpadding);
626 buf += spec->n_rpadding;
Eric Smitha9f7d622008-02-17 19:46:49 +0000627 }
Eric Smitha9f7d622008-02-17 19:46:49 +0000628}
Eric Smithaca19e62009-04-22 13:29:05 +0000629
630static char no_grouping[1] = {CHAR_MAX};
631
632/* Find the decimal point character(s?), thousands_separator(s?), and
633 grouping description, either for the current locale if type is
634 LT_CURRENT_LOCALE, a hard-coded locale if LT_DEFAULT_LOCALE, or
635 none if LT_NO_LOCALE. */
636static void
637get_locale_info(int type, LocaleInfo *locale_info)
638{
639 switch (type) {
640 case LT_CURRENT_LOCALE: {
641 struct lconv *locale_data = localeconv();
642 locale_info->decimal_point = locale_data->decimal_point;
643 locale_info->thousands_sep = locale_data->thousands_sep;
644 locale_info->grouping = locale_data->grouping;
645 break;
646 }
647 case LT_DEFAULT_LOCALE:
648 locale_info->decimal_point = ".";
649 locale_info->thousands_sep = ",";
Benjamin Peterson7dbe3e32010-06-07 22:32:44 +0000650 locale_info->grouping = "\3"; /* Group every 3 characters. The
651 (implicit) trailing 0 means repeat
Eric Smithaca19e62009-04-22 13:29:05 +0000652 infinitely. */
653 break;
654 case LT_NO_LOCALE:
655 locale_info->decimal_point = ".";
656 locale_info->thousands_sep = "";
657 locale_info->grouping = no_grouping;
658 break;
659 default:
660 assert(0);
661 }
662}
663
Eric Smith9139cc62009-04-30 00:58:58 +0000664#endif /* FORMAT_FLOAT || FORMAT_LONG || FORMAT_COMPLEX */
Eric Smitha9f7d622008-02-17 19:46:49 +0000665
666/************************************************************************/
667/*********** string formatting ******************************************/
668/************************************************************************/
669
670static PyObject *
671format_string_internal(PyObject *value, const InternalFormatSpec *format)
672{
Eric Smitha9f7d622008-02-17 19:46:49 +0000673 Py_ssize_t lpad;
Eric Smith9139cc62009-04-30 00:58:58 +0000674 Py_ssize_t rpad;
675 Py_ssize_t total;
676 STRINGLIB_CHAR *p;
Eric Smitha9f7d622008-02-17 19:46:49 +0000677 Py_ssize_t len = STRINGLIB_LEN(value);
678 PyObject *result = NULL;
679
680 /* sign is not allowed on strings */
681 if (format->sign != '\0') {
682 PyErr_SetString(PyExc_ValueError,
683 "Sign not allowed in string format specifier");
684 goto done;
685 }
686
Eric Smithd0c84122008-07-15 10:10:07 +0000687 /* alternate is not allowed on strings */
688 if (format->alternate) {
689 PyErr_SetString(PyExc_ValueError,
690 "Alternate form (#) not allowed in string format "
Eric Smithaca19e62009-04-22 13:29:05 +0000691 "specifier");
Eric Smithd0c84122008-07-15 10:10:07 +0000692 goto done;
693 }
694
Eric Smitha9f7d622008-02-17 19:46:49 +0000695 /* '=' alignment not allowed on strings */
696 if (format->align == '=') {
697 PyErr_SetString(PyExc_ValueError,
698 "'=' alignment not allowed "
699 "in string format specifier");
700 goto done;
701 }
702
703 /* if precision is specified, output no more that format.precision
704 characters */
705 if (format->precision >= 0 && len >= format->precision) {
706 len = format->precision;
707 }
708
Eric Smith9139cc62009-04-30 00:58:58 +0000709 calc_padding(len, format->width, format->align, &lpad, &rpad, &total);
Eric Smitha9f7d622008-02-17 19:46:49 +0000710
711 /* allocate the resulting string */
Eric Smith9139cc62009-04-30 00:58:58 +0000712 result = STRINGLIB_NEW(NULL, total);
Eric Smitha9f7d622008-02-17 19:46:49 +0000713 if (result == NULL)
714 goto done;
715
Eric Smith9139cc62009-04-30 00:58:58 +0000716 /* Write into that space. First the padding. */
717 p = fill_padding(STRINGLIB_STR(result), len,
718 format->fill_char=='\0'?' ':format->fill_char,
719 lpad, rpad);
Eric Smitha9f7d622008-02-17 19:46:49 +0000720
Eric Smith9139cc62009-04-30 00:58:58 +0000721 /* Then the source string. */
722 memcpy(p, STRINGLIB_STR(value), len * sizeof(STRINGLIB_CHAR));
Eric Smitha9f7d622008-02-17 19:46:49 +0000723
724done:
725 return result;
726}
727
728
729/************************************************************************/
730/*********** long formatting ********************************************/
731/************************************************************************/
732
733#if defined FORMAT_LONG || defined FORMAT_INT
734typedef PyObject*
735(*IntOrLongToString)(PyObject *value, int base);
736
737static PyObject *
738format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format,
Eric Smithaca19e62009-04-22 13:29:05 +0000739 IntOrLongToString tostring)
Eric Smitha9f7d622008-02-17 19:46:49 +0000740{
741 PyObject *result = NULL;
742 PyObject *tmp = NULL;
743 STRINGLIB_CHAR *pnumeric_chars;
744 STRINGLIB_CHAR numeric_char;
Eric Smithaca19e62009-04-22 13:29:05 +0000745 STRINGLIB_CHAR sign_char = '\0';
Eric Smitha9f7d622008-02-17 19:46:49 +0000746 Py_ssize_t n_digits; /* count of digits need from the computed
747 string */
Eric Smithaca19e62009-04-22 13:29:05 +0000748 Py_ssize_t n_remainder = 0; /* Used only for 'c' formatting, which
749 produces non-digits */
Eric Smitha5fa5a22008-07-16 00:11:49 +0000750 Py_ssize_t n_prefix = 0; /* Count of prefix chars, (e.g., '0x') */
Eric Smithaca19e62009-04-22 13:29:05 +0000751 Py_ssize_t n_total;
Eric Smitha5fa5a22008-07-16 00:11:49 +0000752 STRINGLIB_CHAR *prefix = NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +0000753 NumberFieldWidths spec;
754 long x;
755
Eric Smithaca19e62009-04-22 13:29:05 +0000756 /* Locale settings, either from the actual locale or
757 from a hard-code pseudo-locale */
758 LocaleInfo locale;
759
Eric Smitha9f7d622008-02-17 19:46:49 +0000760 /* no precision allowed on integers */
761 if (format->precision != -1) {
762 PyErr_SetString(PyExc_ValueError,
763 "Precision not allowed in integer format specifier");
764 goto done;
765 }
766
Eric Smitha9f7d622008-02-17 19:46:49 +0000767 /* special case for character formatting */
768 if (format->type == 'c') {
769 /* error to specify a sign */
770 if (format->sign != '\0') {
771 PyErr_SetString(PyExc_ValueError,
772 "Sign not allowed with integer"
773 " format specifier 'c'");
774 goto done;
775 }
776
Eric Smithaca19e62009-04-22 13:29:05 +0000777 /* Error to specify a comma. */
778 if (format->thousands_separators) {
779 PyErr_SetString(PyExc_ValueError,
780 "Thousands separators not allowed with integer"
781 " format specifier 'c'");
782 goto done;
783 }
784
Eric Smitha9f7d622008-02-17 19:46:49 +0000785 /* taken from unicodeobject.c formatchar() */
786 /* Integer input truncated to a character */
787/* XXX: won't work for int */
788 x = PyLong_AsLong(value);
789 if (x == -1 && PyErr_Occurred())
790 goto done;
791#ifdef Py_UNICODE_WIDE
792 if (x < 0 || x > 0x10ffff) {
793 PyErr_SetString(PyExc_OverflowError,
794 "%c arg not in range(0x110000) "
795 "(wide Python build)");
796 goto done;
797 }
798#else
799 if (x < 0 || x > 0xffff) {
800 PyErr_SetString(PyExc_OverflowError,
801 "%c arg not in range(0x10000) "
802 "(narrow Python build)");
803 goto done;
804 }
805#endif
Eric Smithaca19e62009-04-22 13:29:05 +0000806 numeric_char = (STRINGLIB_CHAR)x;
807 pnumeric_chars = &numeric_char;
Eric Smitha9f7d622008-02-17 19:46:49 +0000808 n_digits = 1;
Eric Smithaca19e62009-04-22 13:29:05 +0000809
810 /* As a sort-of hack, we tell calc_number_widths that we only
811 have "remainder" characters. calc_number_widths thinks
812 these are characters that don't get formatted, only copied
813 into the output string. We do this for 'c' formatting,
814 because the characters are likely to be non-digits. */
815 n_remainder = 1;
Eric Smitha9f7d622008-02-17 19:46:49 +0000816 }
817 else {
818 int base;
Eric Smithaca19e62009-04-22 13:29:05 +0000819 int leading_chars_to_skip = 0; /* Number of characters added by
820 PyNumber_ToBase that we want to
821 skip over. */
Eric Smitha9f7d622008-02-17 19:46:49 +0000822
823 /* Compute the base and how many characters will be added by
824 PyNumber_ToBase */
825 switch (format->type) {
826 case 'b':
827 base = 2;
Eric Smithaca19e62009-04-22 13:29:05 +0000828 leading_chars_to_skip = 2; /* 0b */
Eric Smitha9f7d622008-02-17 19:46:49 +0000829 break;
830 case 'o':
831 base = 8;
Eric Smithaca19e62009-04-22 13:29:05 +0000832 leading_chars_to_skip = 2; /* 0o */
Eric Smitha9f7d622008-02-17 19:46:49 +0000833 break;
834 case 'x':
835 case 'X':
836 base = 16;
Eric Smithaca19e62009-04-22 13:29:05 +0000837 leading_chars_to_skip = 2; /* 0x */
Eric Smitha9f7d622008-02-17 19:46:49 +0000838 break;
839 default: /* shouldn't be needed, but stops a compiler warning */
840 case 'd':
Eric Smithcf537ff2008-05-11 19:52:48 +0000841 case 'n':
Eric Smitha9f7d622008-02-17 19:46:49 +0000842 base = 10;
Eric Smitha9f7d622008-02-17 19:46:49 +0000843 break;
844 }
845
Eric Smithaca19e62009-04-22 13:29:05 +0000846 /* The number of prefix chars is the same as the leading
847 chars to skip */
848 if (format->alternate)
849 n_prefix = leading_chars_to_skip;
Eric Smitha5fa5a22008-07-16 00:11:49 +0000850
Eric Smitha9f7d622008-02-17 19:46:49 +0000851 /* Do the hard part, converting to a string in a given base */
Eric Smithaca19e62009-04-22 13:29:05 +0000852 tmp = tostring(value, base);
Eric Smitha9f7d622008-02-17 19:46:49 +0000853 if (tmp == NULL)
854 goto done;
855
Eric Smithaca19e62009-04-22 13:29:05 +0000856 pnumeric_chars = STRINGLIB_STR(tmp);
Eric Smitha9f7d622008-02-17 19:46:49 +0000857 n_digits = STRINGLIB_LEN(tmp);
858
Eric Smithaca19e62009-04-22 13:29:05 +0000859 prefix = pnumeric_chars;
Eric Smitha5fa5a22008-07-16 00:11:49 +0000860
Eric Smithaca19e62009-04-22 13:29:05 +0000861 /* Remember not to modify what pnumeric_chars points to. it
862 might be interned. Only modify it after we copy it into a
863 newly allocated output buffer. */
Eric Smitha9f7d622008-02-17 19:46:49 +0000864
865 /* Is a sign character present in the output? If so, remember it
866 and skip it */
Eric Smithaca19e62009-04-22 13:29:05 +0000867 if (pnumeric_chars[0] == '-') {
868 sign_char = pnumeric_chars[0];
869 ++prefix;
870 ++leading_chars_to_skip;
Eric Smitha9f7d622008-02-17 19:46:49 +0000871 }
872
Eric Smithaca19e62009-04-22 13:29:05 +0000873 /* Skip over the leading chars (0x, 0b, etc.) */
874 n_digits -= leading_chars_to_skip;
875 pnumeric_chars += leading_chars_to_skip;
Eric Smitha9f7d622008-02-17 19:46:49 +0000876 }
877
Eric Smithaca19e62009-04-22 13:29:05 +0000878 /* Determine the grouping, separator, and decimal point, if any. */
879 get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
880 (format->thousands_separators ?
881 LT_DEFAULT_LOCALE :
882 LT_NO_LOCALE),
883 &locale);
Eric Smithcf537ff2008-05-11 19:52:48 +0000884
Eric Smithaca19e62009-04-22 13:29:05 +0000885 /* Calculate how much memory we'll need. */
886 n_total = calc_number_widths(&spec, n_prefix, sign_char, pnumeric_chars,
887 n_digits, n_remainder, 0, &locale, format);
Eric Smith5dce7e92008-06-24 11:11:59 +0000888
Eric Smithaca19e62009-04-22 13:29:05 +0000889 /* Allocate the memory. */
890 result = STRINGLIB_NEW(NULL, n_total);
Eric Smitha9f7d622008-02-17 19:46:49 +0000891 if (!result)
Eric Smithaca19e62009-04-22 13:29:05 +0000892 goto done;
Eric Smitha9f7d622008-02-17 19:46:49 +0000893
Eric Smithaca19e62009-04-22 13:29:05 +0000894 /* Populate the memory. */
895 fill_number(STRINGLIB_STR(result), &spec, pnumeric_chars, n_digits,
896 prefix, format->fill_char == '\0' ? ' ' : format->fill_char,
897 &locale, format->type == 'X');
Eric Smitha5fa5a22008-07-16 00:11:49 +0000898
Eric Smitha9f7d622008-02-17 19:46:49 +0000899done:
900 Py_XDECREF(tmp);
901 return result;
902}
903#endif /* defined FORMAT_LONG || defined FORMAT_INT */
904
905/************************************************************************/
906/*********** float formatting *******************************************/
907/************************************************************************/
908
909#ifdef FORMAT_FLOAT
910#if STRINGLIB_IS_UNICODE
Eric Smithaca19e62009-04-22 13:29:05 +0000911static void
912strtounicode(Py_UNICODE *buffer, const char *charbuffer, Py_ssize_t len)
Eric Smitha9f7d622008-02-17 19:46:49 +0000913{
Eric Smithaca19e62009-04-22 13:29:05 +0000914 Py_ssize_t i;
915 for (i = 0; i < len; ++i)
916 buffer[i] = (Py_UNICODE)charbuffer[i];
Eric Smitha9f7d622008-02-17 19:46:49 +0000917}
918#endif
919
Eric Smitha9f7d622008-02-17 19:46:49 +0000920/* much of this is taken from unicodeobject.c */
Eric Smitha9f7d622008-02-17 19:46:49 +0000921static PyObject *
Eric Smith8a803dd2008-02-20 23:39:28 +0000922format_float_internal(PyObject *value,
Eric Smithaca19e62009-04-22 13:29:05 +0000923 const InternalFormatSpec *format)
Eric Smitha9f7d622008-02-17 19:46:49 +0000924{
Eric Smithaca19e62009-04-22 13:29:05 +0000925 char *buf = NULL; /* buffer returned from PyOS_double_to_string */
Eric Smitha9f7d622008-02-17 19:46:49 +0000926 Py_ssize_t n_digits;
Eric Smithaca19e62009-04-22 13:29:05 +0000927 Py_ssize_t n_remainder;
928 Py_ssize_t n_total;
929 int has_decimal;
930 double val;
Eric Smitha9f7d622008-02-17 19:46:49 +0000931 Py_ssize_t precision = format->precision;
Eric Smitha985a3a2009-05-05 18:26:08 +0000932 Py_ssize_t default_precision = 6;
Eric Smithaca19e62009-04-22 13:29:05 +0000933 STRINGLIB_CHAR type = format->type;
934 int add_pct = 0;
Eric Smitha9f7d622008-02-17 19:46:49 +0000935 STRINGLIB_CHAR *p;
936 NumberFieldWidths spec;
Eric Smithaca19e62009-04-22 13:29:05 +0000937 int flags = 0;
938 PyObject *result = NULL;
939 STRINGLIB_CHAR sign_char = '\0';
940 int float_type; /* Used to see if we have a nan, inf, or regular float. */
Eric Smitha9f7d622008-02-17 19:46:49 +0000941
942#if STRINGLIB_IS_UNICODE
Eric Smithaca19e62009-04-22 13:29:05 +0000943 Py_UNICODE *unicode_tmp = NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +0000944#endif
945
Eric Smithaca19e62009-04-22 13:29:05 +0000946 /* Locale settings, either from the actual locale or
947 from a hard-code pseudo-locale */
948 LocaleInfo locale;
949
950 /* Alternate is not allowed on floats. */
Eric Smithd0c84122008-07-15 10:10:07 +0000951 if (format->alternate) {
952 PyErr_SetString(PyExc_ValueError,
953 "Alternate form (#) not allowed in float format "
Eric Smithaca19e62009-04-22 13:29:05 +0000954 "specifier");
Eric Smithd0c84122008-07-15 10:10:07 +0000955 goto done;
956 }
957
Eric Smithaca19e62009-04-22 13:29:05 +0000958 if (type == '\0') {
Eric Smitha985a3a2009-05-05 18:26:08 +0000959 /* Omitted type specifier. This is like 'g' but with at least one
960 digit after the decimal point, and different default precision.*/
Eric Smithaca19e62009-04-22 13:29:05 +0000961 type = 'g';
Eric Smitha985a3a2009-05-05 18:26:08 +0000962 default_precision = PyFloat_STR_PRECISION;
Eric Smithaca19e62009-04-22 13:29:05 +0000963 flags |= Py_DTSF_ADD_DOT_0;
964 }
965
966 if (type == 'n')
967 /* 'n' is the same as 'g', except for the locale used to
968 format the result. We take care of that later. */
969 type = 'g';
Eric Smitha9f7d622008-02-17 19:46:49 +0000970
Eric Smithaca19e62009-04-22 13:29:05 +0000971 val = PyFloat_AsDouble(value);
972 if (val == -1.0 && PyErr_Occurred())
Eric Smitha9f7d622008-02-17 19:46:49 +0000973 goto done;
974
975 if (type == '%') {
976 type = 'f';
Eric Smithaca19e62009-04-22 13:29:05 +0000977 val *= 100;
978 add_pct = 1;
Eric Smitha9f7d622008-02-17 19:46:49 +0000979 }
980
981 if (precision < 0)
Eric Smitha985a3a2009-05-05 18:26:08 +0000982 precision = default_precision;
Eric Smith27f204d2009-05-02 09:58:09 +0000983
Eric Smithaca19e62009-04-22 13:29:05 +0000984 /* Cast "type", because if we're in unicode we need to pass a
985 8-bit char. This is safe, because we've restricted what "type"
986 can be. */
987 buf = PyOS_double_to_string(val, (char)type, precision, flags,
988 &float_type);
989 if (buf == NULL)
990 goto done;
991 n_digits = strlen(buf);
Eric Smitha9f7d622008-02-17 19:46:49 +0000992
Eric Smithaca19e62009-04-22 13:29:05 +0000993 if (add_pct) {
994 /* We know that buf has a trailing zero (since we just called
995 strlen() on it), and we don't use that fact any more. So we
996 can just write over the trailing zero. */
997 buf[n_digits] = '%';
998 n_digits += 1;
999 }
Eric Smitha9f7d622008-02-17 19:46:49 +00001000
Eric Smithaca19e62009-04-22 13:29:05 +00001001 /* Since there is no unicode version of PyOS_double_to_string,
1002 just use the 8 bit version and then convert to unicode. */
Eric Smitha9f7d622008-02-17 19:46:49 +00001003#if STRINGLIB_IS_UNICODE
Eric Smithaca19e62009-04-22 13:29:05 +00001004 unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_digits)*sizeof(Py_UNICODE));
1005 if (unicode_tmp == NULL) {
1006 PyErr_NoMemory();
1007 goto done;
1008 }
1009 strtounicode(unicode_tmp, buf, n_digits);
1010 p = unicode_tmp;
Eric Smitha9f7d622008-02-17 19:46:49 +00001011#else
Eric Smithaca19e62009-04-22 13:29:05 +00001012 p = buf;
Eric Smitha9f7d622008-02-17 19:46:49 +00001013#endif
1014
Eric Smithaca19e62009-04-22 13:29:05 +00001015 /* Is a sign character present in the output? If so, remember it
Eric Smitha9f7d622008-02-17 19:46:49 +00001016 and skip it */
Eric Smithaca19e62009-04-22 13:29:05 +00001017 if (*p == '-') {
1018 sign_char = *p;
Eric Smith8a803dd2008-02-20 23:39:28 +00001019 ++p;
1020 --n_digits;
Eric Smitha9f7d622008-02-17 19:46:49 +00001021 }
1022
Eric Smithaca19e62009-04-22 13:29:05 +00001023 /* Determine if we have any "remainder" (after the digits, might include
1024 decimal or exponent or both (or neither)) */
1025 parse_number(p, n_digits, &n_remainder, &has_decimal);
Eric Smitha9f7d622008-02-17 19:46:49 +00001026
Eric Smithaca19e62009-04-22 13:29:05 +00001027 /* Determine the grouping, separator, and decimal point, if any. */
1028 get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
1029 (format->thousands_separators ?
1030 LT_DEFAULT_LOCALE :
1031 LT_NO_LOCALE),
1032 &locale);
1033
1034 /* Calculate how much memory we'll need. */
1035 n_total = calc_number_widths(&spec, 0, sign_char, p, n_digits,
1036 n_remainder, has_decimal, &locale, format);
1037
1038 /* Allocate the memory. */
1039 result = STRINGLIB_NEW(NULL, n_total);
Eric Smitha9f7d622008-02-17 19:46:49 +00001040 if (result == NULL)
1041 goto done;
1042
Eric Smithaca19e62009-04-22 13:29:05 +00001043 /* Populate the memory. */
1044 fill_number(STRINGLIB_STR(result), &spec, p, n_digits, NULL,
1045 format->fill_char == '\0' ? ' ' : format->fill_char, &locale,
1046 0);
Eric Smitha9f7d622008-02-17 19:46:49 +00001047
1048done:
Eric Smithaca19e62009-04-22 13:29:05 +00001049 PyMem_Free(buf);
1050#if STRINGLIB_IS_UNICODE
1051 PyMem_Free(unicode_tmp);
1052#endif
Eric Smitha9f7d622008-02-17 19:46:49 +00001053 return result;
1054}
Eric Smitha9f7d622008-02-17 19:46:49 +00001055#endif /* FORMAT_FLOAT */
1056
1057/************************************************************************/
Eric Smith9139cc62009-04-30 00:58:58 +00001058/*********** complex formatting *****************************************/
1059/************************************************************************/
1060
1061#ifdef FORMAT_COMPLEX
1062
1063static PyObject *
1064format_complex_internal(PyObject *value,
1065 const InternalFormatSpec *format)
1066{
1067 double re;
1068 double im;
1069 char *re_buf = NULL; /* buffer returned from PyOS_double_to_string */
1070 char *im_buf = NULL; /* buffer returned from PyOS_double_to_string */
1071
1072 InternalFormatSpec tmp_format = *format;
1073 Py_ssize_t n_re_digits;
1074 Py_ssize_t n_im_digits;
1075 Py_ssize_t n_re_remainder;
1076 Py_ssize_t n_im_remainder;
1077 Py_ssize_t n_re_total;
1078 Py_ssize_t n_im_total;
1079 int re_has_decimal;
1080 int im_has_decimal;
1081 Py_ssize_t precision = format->precision;
Eric Smitha985a3a2009-05-05 18:26:08 +00001082 Py_ssize_t default_precision = 6;
Eric Smith9139cc62009-04-30 00:58:58 +00001083 STRINGLIB_CHAR type = format->type;
1084 STRINGLIB_CHAR *p_re;
1085 STRINGLIB_CHAR *p_im;
1086 NumberFieldWidths re_spec;
1087 NumberFieldWidths im_spec;
1088 int flags = 0;
1089 PyObject *result = NULL;
1090 STRINGLIB_CHAR *p;
1091 STRINGLIB_CHAR re_sign_char = '\0';
1092 STRINGLIB_CHAR im_sign_char = '\0';
1093 int re_float_type; /* Used to see if we have a nan, inf, or regular float. */
1094 int im_float_type;
1095 int add_parens = 0;
1096 int skip_re = 0;
1097 Py_ssize_t lpad;
1098 Py_ssize_t rpad;
1099 Py_ssize_t total;
1100
1101#if STRINGLIB_IS_UNICODE
1102 Py_UNICODE *re_unicode_tmp = NULL;
1103 Py_UNICODE *im_unicode_tmp = NULL;
1104#endif
1105
1106 /* Locale settings, either from the actual locale or
1107 from a hard-code pseudo-locale */
1108 LocaleInfo locale;
1109
1110 /* Alternate is not allowed on complex. */
1111 if (format->alternate) {
1112 PyErr_SetString(PyExc_ValueError,
1113 "Alternate form (#) not allowed in complex format "
1114 "specifier");
1115 goto done;
1116 }
1117
1118 /* Neither is zero pading. */
1119 if (format->fill_char == '0') {
1120 PyErr_SetString(PyExc_ValueError,
1121 "Zero padding is not allowed in complex format "
1122 "specifier");
1123 goto done;
1124 }
1125
1126 /* Neither is '=' alignment . */
1127 if (format->align == '=') {
1128 PyErr_SetString(PyExc_ValueError,
1129 "'=' alignment flag is not allowed in complex format "
1130 "specifier");
1131 goto done;
1132 }
1133
1134 re = PyComplex_RealAsDouble(value);
1135 if (re == -1.0 && PyErr_Occurred())
1136 goto done;
1137 im = PyComplex_ImagAsDouble(value);
1138 if (im == -1.0 && PyErr_Occurred())
1139 goto done;
1140
1141 if (type == '\0') {
1142 /* Omitted type specifier. Should be like str(self). */
1143 type = 'g';
Eric Smitha985a3a2009-05-05 18:26:08 +00001144 default_precision = PyFloat_STR_PRECISION;
Mark Dickinsonaad57bd2010-08-01 10:45:15 +00001145 if (re == 0.0 && copysign(1.0, re) == 1.0)
Eric Smith9139cc62009-04-30 00:58:58 +00001146 skip_re = 1;
Mark Dickinsonaad57bd2010-08-01 10:45:15 +00001147 else
1148 add_parens = 1;
Eric Smith9139cc62009-04-30 00:58:58 +00001149 }
1150
1151 if (type == 'n')
1152 /* 'n' is the same as 'g', except for the locale used to
1153 format the result. We take care of that later. */
1154 type = 'g';
1155
Eric Smith9139cc62009-04-30 00:58:58 +00001156 if (precision < 0)
Eric Smitha985a3a2009-05-05 18:26:08 +00001157 precision = default_precision;
Eric Smith9139cc62009-04-30 00:58:58 +00001158
1159 /* Cast "type", because if we're in unicode we need to pass a
1160 8-bit char. This is safe, because we've restricted what "type"
1161 can be. */
1162 re_buf = PyOS_double_to_string(re, (char)type, precision, flags,
1163 &re_float_type);
1164 if (re_buf == NULL)
1165 goto done;
1166 im_buf = PyOS_double_to_string(im, (char)type, precision, flags,
1167 &im_float_type);
1168 if (im_buf == NULL)
1169 goto done;
1170
1171 n_re_digits = strlen(re_buf);
1172 n_im_digits = strlen(im_buf);
1173
1174 /* Since there is no unicode version of PyOS_double_to_string,
1175 just use the 8 bit version and then convert to unicode. */
1176#if STRINGLIB_IS_UNICODE
1177 re_unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_re_digits)*sizeof(Py_UNICODE));
1178 if (re_unicode_tmp == NULL) {
1179 PyErr_NoMemory();
1180 goto done;
1181 }
1182 strtounicode(re_unicode_tmp, re_buf, n_re_digits);
1183 p_re = re_unicode_tmp;
1184
1185 im_unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_im_digits)*sizeof(Py_UNICODE));
1186 if (im_unicode_tmp == NULL) {
1187 PyErr_NoMemory();
1188 goto done;
1189 }
1190 strtounicode(im_unicode_tmp, im_buf, n_im_digits);
1191 p_im = im_unicode_tmp;
1192#else
1193 p_re = re_buf;
1194 p_im = im_buf;
1195#endif
1196
1197 /* Is a sign character present in the output? If so, remember it
1198 and skip it */
1199 if (*p_re == '-') {
1200 re_sign_char = *p_re;
1201 ++p_re;
1202 --n_re_digits;
1203 }
1204 if (*p_im == '-') {
1205 im_sign_char = *p_im;
1206 ++p_im;
1207 --n_im_digits;
1208 }
1209
1210 /* Determine if we have any "remainder" (after the digits, might include
1211 decimal or exponent or both (or neither)) */
1212 parse_number(p_re, n_re_digits, &n_re_remainder, &re_has_decimal);
1213 parse_number(p_im, n_im_digits, &n_im_remainder, &im_has_decimal);
1214
1215 /* Determine the grouping, separator, and decimal point, if any. */
1216 get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
1217 (format->thousands_separators ?
1218 LT_DEFAULT_LOCALE :
1219 LT_NO_LOCALE),
1220 &locale);
1221
1222 /* Turn off any padding. We'll do it later after we've composed
1223 the numbers without padding. */
1224 tmp_format.fill_char = '\0';
Eric Smithf32d4ac2010-02-22 18:33:47 +00001225 tmp_format.align = '<';
Eric Smith9139cc62009-04-30 00:58:58 +00001226 tmp_format.width = -1;
1227
1228 /* Calculate how much memory we'll need. */
1229 n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, p_re,
1230 n_re_digits, n_re_remainder,
1231 re_has_decimal, &locale, &tmp_format);
1232
Mark Dickinsonaad57bd2010-08-01 10:45:15 +00001233 /* Same formatting, but always include a sign, unless the real part is
1234 * going to be omitted, in which case we use whatever sign convention was
1235 * requested by the original format. */
1236 if (!skip_re)
1237 tmp_format.sign = '+';
Eric Smith9139cc62009-04-30 00:58:58 +00001238 n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, p_im,
1239 n_im_digits, n_im_remainder,
1240 im_has_decimal, &locale, &tmp_format);
1241
1242 if (skip_re)
1243 n_re_total = 0;
1244
1245 /* Add 1 for the 'j', and optionally 2 for parens. */
1246 calc_padding(n_re_total + n_im_total + 1 + add_parens * 2,
1247 format->width, format->align, &lpad, &rpad, &total);
1248
1249 result = STRINGLIB_NEW(NULL, total);
1250 if (result == NULL)
1251 goto done;
1252
1253 /* Populate the memory. First, the padding. */
1254 p = fill_padding(STRINGLIB_STR(result),
1255 n_re_total + n_im_total + 1 + add_parens * 2,
1256 format->fill_char=='\0' ? ' ' : format->fill_char,
1257 lpad, rpad);
1258
1259 if (add_parens)
1260 *p++ = '(';
1261
1262 if (!skip_re) {
1263 fill_number(p, &re_spec, p_re, n_re_digits, NULL, 0, &locale, 0);
1264 p += n_re_total;
1265 }
1266 fill_number(p, &im_spec, p_im, n_im_digits, NULL, 0, &locale, 0);
1267 p += n_im_total;
1268 *p++ = 'j';
1269
1270 if (add_parens)
1271 *p++ = ')';
1272
1273done:
1274 PyMem_Free(re_buf);
1275 PyMem_Free(im_buf);
1276#if STRINGLIB_IS_UNICODE
1277 PyMem_Free(re_unicode_tmp);
1278 PyMem_Free(im_unicode_tmp);
1279#endif
1280 return result;
1281}
1282#endif /* FORMAT_COMPLEX */
1283
1284/************************************************************************/
Eric Smitha9f7d622008-02-17 19:46:49 +00001285/*********** built in formatters ****************************************/
1286/************************************************************************/
Eric Smitha9f7d622008-02-17 19:46:49 +00001287PyObject *
Eric Smithdc13b792008-05-30 18:10:04 +00001288FORMAT_STRING(PyObject *obj,
Eric Smithaca19e62009-04-22 13:29:05 +00001289 STRINGLIB_CHAR *format_spec,
1290 Py_ssize_t format_spec_len)
Eric Smitha9f7d622008-02-17 19:46:49 +00001291{
Eric Smitha9f7d622008-02-17 19:46:49 +00001292 InternalFormatSpec format;
Eric Smithdc13b792008-05-30 18:10:04 +00001293 PyObject *result = NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00001294
1295 /* check for the special case of zero length format spec, make
Eric Smithdc13b792008-05-30 18:10:04 +00001296 it equivalent to str(obj) */
1297 if (format_spec_len == 0) {
1298 result = STRINGLIB_TOSTR(obj);
Eric Smitha9f7d622008-02-17 19:46:49 +00001299 goto done;
1300 }
1301
Eric Smitha9f7d622008-02-17 19:46:49 +00001302 /* parse the format_spec */
Eric Smithdc13b792008-05-30 18:10:04 +00001303 if (!parse_internal_render_format_spec(format_spec, format_spec_len,
Eric Smithf32d4ac2010-02-22 18:33:47 +00001304 &format, 's', '<'))
Eric Smitha9f7d622008-02-17 19:46:49 +00001305 goto done;
1306
1307 /* type conversion? */
1308 switch (format.type) {
1309 case 's':
1310 /* no type conversion needed, already a string. do the formatting */
Eric Smithdc13b792008-05-30 18:10:04 +00001311 result = format_string_internal(obj, &format);
Eric Smitha9f7d622008-02-17 19:46:49 +00001312 break;
1313 default:
1314 /* unknown */
Eric Smithe9fb6862009-02-20 14:02:36 +00001315 unknown_presentation_type(format.type, obj->ob_type->tp_name);
Eric Smitha9f7d622008-02-17 19:46:49 +00001316 goto done;
1317 }
1318
1319done:
Eric Smitha9f7d622008-02-17 19:46:49 +00001320 return result;
1321}
Eric Smitha9f7d622008-02-17 19:46:49 +00001322
1323#if defined FORMAT_LONG || defined FORMAT_INT
1324static PyObject*
Eric Smithdc13b792008-05-30 18:10:04 +00001325format_int_or_long(PyObject* obj,
Eric Smithaca19e62009-04-22 13:29:05 +00001326 STRINGLIB_CHAR *format_spec,
1327 Py_ssize_t format_spec_len,
1328 IntOrLongToString tostring)
Eric Smitha9f7d622008-02-17 19:46:49 +00001329{
Eric Smitha9f7d622008-02-17 19:46:49 +00001330 PyObject *result = NULL;
1331 PyObject *tmp = NULL;
1332 InternalFormatSpec format;
1333
Eric Smitha9f7d622008-02-17 19:46:49 +00001334 /* check for the special case of zero length format spec, make
Eric Smithdc13b792008-05-30 18:10:04 +00001335 it equivalent to str(obj) */
1336 if (format_spec_len == 0) {
1337 result = STRINGLIB_TOSTR(obj);
Eric Smitha9f7d622008-02-17 19:46:49 +00001338 goto done;
1339 }
1340
1341 /* parse the format_spec */
Eric Smithdc13b792008-05-30 18:10:04 +00001342 if (!parse_internal_render_format_spec(format_spec,
Eric Smithaca19e62009-04-22 13:29:05 +00001343 format_spec_len,
Eric Smithf32d4ac2010-02-22 18:33:47 +00001344 &format, 'd', '>'))
Eric Smitha9f7d622008-02-17 19:46:49 +00001345 goto done;
1346
1347 /* type conversion? */
1348 switch (format.type) {
1349 case 'b':
1350 case 'c':
1351 case 'd':
1352 case 'o':
1353 case 'x':
1354 case 'X':
Eric Smithcf537ff2008-05-11 19:52:48 +00001355 case 'n':
Eric Smitha9f7d622008-02-17 19:46:49 +00001356 /* no type conversion needed, already an int (or long). do
Eric Smithaca19e62009-04-22 13:29:05 +00001357 the formatting */
1358 result = format_int_or_long_internal(obj, &format, tostring);
Eric Smitha9f7d622008-02-17 19:46:49 +00001359 break;
1360
1361 case 'e':
1362 case 'E':
1363 case 'f':
1364 case 'F':
1365 case 'g':
1366 case 'G':
Eric Smitha9f7d622008-02-17 19:46:49 +00001367 case '%':
1368 /* convert to float */
Eric Smithdc13b792008-05-30 18:10:04 +00001369 tmp = PyNumber_Float(obj);
Eric Smitha9f7d622008-02-17 19:46:49 +00001370 if (tmp == NULL)
1371 goto done;
Eric Smith8c023242009-04-13 00:29:50 +00001372 result = format_float_internal(tmp, &format);
Eric Smitha9f7d622008-02-17 19:46:49 +00001373 break;
1374
1375 default:
1376 /* unknown */
Eric Smithe9fb6862009-02-20 14:02:36 +00001377 unknown_presentation_type(format.type, obj->ob_type->tp_name);
Eric Smitha9f7d622008-02-17 19:46:49 +00001378 goto done;
1379 }
1380
1381done:
1382 Py_XDECREF(tmp);
1383 return result;
1384}
1385#endif /* FORMAT_LONG || defined FORMAT_INT */
1386
1387#ifdef FORMAT_LONG
1388/* Need to define long_format as a function that will convert a long
1389 to a string. In 3.0, _PyLong_Format has the correct signature. In
1390 2.x, we need to fudge a few parameters */
1391#if PY_VERSION_HEX >= 0x03000000
1392#define long_format _PyLong_Format
1393#else
1394static PyObject*
1395long_format(PyObject* value, int base)
1396{
1397 /* Convert to base, don't add trailing 'L', and use the new octal
1398 format. We already know this is a long object */
1399 assert(PyLong_Check(value));
1400 /* convert to base, don't add 'L', and use the new octal format */
1401 return _PyLong_Format(value, base, 0, 1);
1402}
1403#endif
1404
1405PyObject *
Eric Smithdc13b792008-05-30 18:10:04 +00001406FORMAT_LONG(PyObject *obj,
Eric Smithaca19e62009-04-22 13:29:05 +00001407 STRINGLIB_CHAR *format_spec,
1408 Py_ssize_t format_spec_len)
Eric Smitha9f7d622008-02-17 19:46:49 +00001409{
Eric Smithdc13b792008-05-30 18:10:04 +00001410 return format_int_or_long(obj, format_spec, format_spec_len,
Eric Smithaca19e62009-04-22 13:29:05 +00001411 long_format);
Eric Smitha9f7d622008-02-17 19:46:49 +00001412}
1413#endif /* FORMAT_LONG */
1414
1415#ifdef FORMAT_INT
1416/* this is only used for 2.x, not 3.0 */
1417static PyObject*
1418int_format(PyObject* value, int base)
1419{
1420 /* Convert to base, and use the new octal format. We already
1421 know this is an int object */
1422 assert(PyInt_Check(value));
1423 return _PyInt_Format((PyIntObject*)value, base, 1);
1424}
1425
1426PyObject *
Eric Smithdc13b792008-05-30 18:10:04 +00001427FORMAT_INT(PyObject *obj,
Eric Smithaca19e62009-04-22 13:29:05 +00001428 STRINGLIB_CHAR *format_spec,
1429 Py_ssize_t format_spec_len)
Eric Smitha9f7d622008-02-17 19:46:49 +00001430{
Eric Smithdc13b792008-05-30 18:10:04 +00001431 return format_int_or_long(obj, format_spec, format_spec_len,
Eric Smithaca19e62009-04-22 13:29:05 +00001432 int_format);
Eric Smitha9f7d622008-02-17 19:46:49 +00001433}
1434#endif /* FORMAT_INT */
1435
1436#ifdef FORMAT_FLOAT
1437PyObject *
Eric Smithdc13b792008-05-30 18:10:04 +00001438FORMAT_FLOAT(PyObject *obj,
Eric Smithaca19e62009-04-22 13:29:05 +00001439 STRINGLIB_CHAR *format_spec,
1440 Py_ssize_t format_spec_len)
Eric Smitha9f7d622008-02-17 19:46:49 +00001441{
Eric Smitha9f7d622008-02-17 19:46:49 +00001442 PyObject *result = NULL;
1443 InternalFormatSpec format;
1444
Eric Smitha9f7d622008-02-17 19:46:49 +00001445 /* check for the special case of zero length format spec, make
Eric Smithdc13b792008-05-30 18:10:04 +00001446 it equivalent to str(obj) */
1447 if (format_spec_len == 0) {
1448 result = STRINGLIB_TOSTR(obj);
Eric Smitha9f7d622008-02-17 19:46:49 +00001449 goto done;
1450 }
1451
1452 /* parse the format_spec */
Eric Smithdc13b792008-05-30 18:10:04 +00001453 if (!parse_internal_render_format_spec(format_spec,
Eric Smithaca19e62009-04-22 13:29:05 +00001454 format_spec_len,
Eric Smithf32d4ac2010-02-22 18:33:47 +00001455 &format, '\0', '>'))
Eric Smitha9f7d622008-02-17 19:46:49 +00001456 goto done;
1457
1458 /* type conversion? */
1459 switch (format.type) {
Eric Smithaca19e62009-04-22 13:29:05 +00001460 case '\0': /* No format code: like 'g', but with at least one decimal. */
Eric Smitha9f7d622008-02-17 19:46:49 +00001461 case 'e':
1462 case 'E':
1463 case 'f':
1464 case 'F':
1465 case 'g':
1466 case 'G':
1467 case 'n':
1468 case '%':
1469 /* no conversion, already a float. do the formatting */
Eric Smithdc13b792008-05-30 18:10:04 +00001470 result = format_float_internal(obj, &format);
Eric Smitha9f7d622008-02-17 19:46:49 +00001471 break;
1472
1473 default:
1474 /* unknown */
Eric Smithe9fb6862009-02-20 14:02:36 +00001475 unknown_presentation_type(format.type, obj->ob_type->tp_name);
Eric Smitha9f7d622008-02-17 19:46:49 +00001476 goto done;
1477 }
1478
1479done:
1480 return result;
1481}
1482#endif /* FORMAT_FLOAT */
Eric Smith9139cc62009-04-30 00:58:58 +00001483
1484#ifdef FORMAT_COMPLEX
1485PyObject *
1486FORMAT_COMPLEX(PyObject *obj,
1487 STRINGLIB_CHAR *format_spec,
1488 Py_ssize_t format_spec_len)
1489{
1490 PyObject *result = NULL;
1491 InternalFormatSpec format;
1492
1493 /* check for the special case of zero length format spec, make
1494 it equivalent to str(obj) */
1495 if (format_spec_len == 0) {
1496 result = STRINGLIB_TOSTR(obj);
1497 goto done;
1498 }
1499
1500 /* parse the format_spec */
1501 if (!parse_internal_render_format_spec(format_spec,
1502 format_spec_len,
Eric Smithf32d4ac2010-02-22 18:33:47 +00001503 &format, '\0', '>'))
Eric Smith9139cc62009-04-30 00:58:58 +00001504 goto done;
1505
1506 /* type conversion? */
1507 switch (format.type) {
1508 case '\0': /* No format code: like 'g', but with at least one decimal. */
1509 case 'e':
1510 case 'E':
1511 case 'f':
1512 case 'F':
1513 case 'g':
1514 case 'G':
1515 case 'n':
1516 /* no conversion, already a complex. do the formatting */
1517 result = format_complex_internal(obj, &format);
1518 break;
1519
1520 default:
1521 /* unknown */
1522 unknown_presentation_type(format.type, obj->ob_type->tp_name);
1523 goto done;
1524 }
1525
1526done:
1527 return result;
1528}
1529#endif /* FORMAT_COMPLEX */