1 /* implements the string, long, and float formatters. that is,
2 string.__format__, etc. */
6 /* Before including this, you must include either:
7 stringlib/unicodedefs.h
10 Also, you should define the names:
15 to be whatever you want the public names of these functions to
16 be. These are the only non-static functions defined here.
19 /* Raises an exception about an unknown presentation type for this
23 unknown_presentation_type(STRINGLIB_CHAR presentation_type
,
24 const char* type_name
)
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)
32 PyErr_Format(PyExc_ValueError
,
33 "Unknown format code '%c' "
34 "for object of type '%.200s'",
35 (char)presentation_type
,
37 #if STRINGLIB_IS_UNICODE
39 PyErr_Format(PyExc_ValueError
,
40 "Unknown format code '\\x%x' "
41 "for object of type '%.200s'",
42 (unsigned int)presentation_type
,
48 invalid_comma_type(STRINGLIB_CHAR presentation_type
)
50 #if STRINGLIB_IS_UNICODE
51 /* See comment in unknown_presentation_type */
52 if (presentation_type
> 32 && presentation_type
< 128)
54 PyErr_Format(PyExc_ValueError
,
55 "Cannot specify ',' with '%c'.",
56 (char)presentation_type
);
57 #if STRINGLIB_IS_UNICODE
59 PyErr_Format(PyExc_ValueError
,
60 "Cannot specify ',' with '\\x%x'.",
61 (unsigned int)presentation_type
);
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.
73 get_integer(STRINGLIB_CHAR
**ptr
, STRINGLIB_CHAR
*end
,
76 Py_ssize_t accumulator
, digitval
;
78 accumulator
= numdigits
= 0;
79 for (;;(*ptr
)++, numdigits
++) {
82 digitval
= STRINGLIB_TODECIMAL(**ptr
);
86 Detect possible overflow before it happens:
88 accumulator * 10 + digitval > PY_SSIZE_T_MAX if and only if
89 accumulator > (PY_SSIZE_T_MAX - digitval) / 10.
91 if (accumulator
> (PY_SSIZE_T_MAX
- digitval
) / 10) {
92 PyErr_Format(PyExc_ValueError
,
93 "Too many decimal digits in format string");
96 accumulator
= accumulator
* 10 + digitval
;
98 *result
= accumulator
;
102 /************************************************************************/
103 /*********** standard format specifier parsing **************************/
104 /************************************************************************/
106 /* returns true if this character is a specifier alignment token */
108 is_alignment_token(STRINGLIB_CHAR c
)
111 case '<': case '>': case '=': case '^':
118 /* returns true if this character is a sign element */
120 is_sign_element(STRINGLIB_CHAR c
)
123 case ' ': case '+': case '-':
132 STRINGLIB_CHAR fill_char
;
133 STRINGLIB_CHAR align
;
137 int thousands_separators
;
138 Py_ssize_t precision
;
140 } InternalFormatSpec
;
144 /* Occassionally useful for debugging. Should normally be commented out. */
146 DEBUG_PRINT_FORMAT_SPEC(InternalFormatSpec
*format
)
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
);
152 printf("internal format spec: width %zd\n", format
->width
);
153 printf("internal format spec: thousands_separators %d\n",
154 format
->thousands_separators
);
155 printf("internal format spec: precision %zd\n", format
->precision
);
156 printf("internal format spec: type %c\n", format
->type
);
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
169 parse_internal_render_format_spec(STRINGLIB_CHAR
*format_spec
,
170 Py_ssize_t format_spec_len
,
171 InternalFormatSpec
*format
,
175 STRINGLIB_CHAR
*ptr
= format_spec
;
176 STRINGLIB_CHAR
*end
= format_spec
+ format_spec_len
;
178 /* end-ptr is used throughout this code to specify the length of
182 int align_specified
= 0;
183 int fill_char_specified
= 0;
185 format
->fill_char
= ' ';
186 format
->align
= default_align
;
187 format
->alternate
= 0;
190 format
->thousands_separators
= 0;
191 format
->precision
= -1;
192 format
->type
= default_type
;
194 /* If the second char is an alignment token,
195 then parse the fill char */
196 if (end
-ptr
>= 2 && is_alignment_token(ptr
[1])) {
197 format
->align
= ptr
[1];
198 format
->fill_char
= ptr
[0];
199 fill_char_specified
= 1;
203 else if (end
-ptr
>= 1 && is_alignment_token(ptr
[0])) {
204 format
->align
= ptr
[0];
209 /* Parse the various sign options */
210 if (end
-ptr
>= 1 && is_sign_element(ptr
[0])) {
211 format
->sign
= ptr
[0];
215 /* If the next character is #, we're in alternate mode. This only
216 applies to integers. */
217 if (end
-ptr
>= 1 && ptr
[0] == '#') {
218 format
->alternate
= 1;
222 /* The special case for 0-padding (backwards compat) */
223 if (!fill_char_specified
&& end
-ptr
>= 1 && ptr
[0] == '0') {
224 format
->fill_char
= '0';
225 if (!align_specified
) {
231 consumed
= get_integer(&ptr
, end
, &format
->width
);
233 /* Overflow error. Exception already set. */
236 /* If consumed is 0, we didn't consume any characters for the
237 width. In that case, reset the width to -1, because
238 get_integer() will have set it to zero. -1 is how we record
239 that the width wasn't specified. */
243 /* Comma signifies add thousands separators */
244 if (end
-ptr
&& ptr
[0] == ',') {
245 format
->thousands_separators
= 1;
249 /* Parse field precision */
250 if (end
-ptr
&& ptr
[0] == '.') {
253 consumed
= get_integer(&ptr
, end
, &format
->precision
);
255 /* Overflow error. Exception already set. */
258 /* Not having a precision after a dot is an error. */
260 PyErr_Format(PyExc_ValueError
,
261 "Format specifier missing precision");
267 /* Finally, parse the type field. */
270 /* More than one char remain, invalid conversion spec. */
271 PyErr_Format(PyExc_ValueError
, "Invalid conversion specification");
276 format
->type
= ptr
[0];
280 /* Do as much validating as we can, just by looking at the format
281 specifier. Do not take into account what type of formatting
282 we're doing (int, float, string). */
284 if (format
->thousands_separators
) {
285 switch (format
->type
) {
295 /* These are allowed. See PEP 378.*/
298 invalid_comma_type(format
->type
);
306 /* Calculate the padding needed. */
308 calc_padding(Py_ssize_t nchars
, Py_ssize_t width
, STRINGLIB_CHAR align
,
309 Py_ssize_t
*n_lpadding
, Py_ssize_t
*n_rpadding
,
319 /* not specified, use all of the chars and no more */
323 /* Figure out how much leading space we need, based on the
326 *n_lpadding
= *n_total
- nchars
;
327 else if (align
== '^')
328 *n_lpadding
= (*n_total
- nchars
) / 2;
329 else if (align
== '<' || align
== '=')
332 /* We should never have an unspecified alignment. */
337 *n_rpadding
= *n_total
- nchars
- *n_lpadding
;
340 /* Do the padding, and return a pointer to where the caller-supplied
342 static STRINGLIB_CHAR
*
343 fill_padding(STRINGLIB_CHAR
*p
, Py_ssize_t nchars
, STRINGLIB_CHAR fill_char
,
344 Py_ssize_t n_lpadding
, Py_ssize_t n_rpadding
)
348 STRINGLIB_FILL(p
, fill_char
, n_lpadding
);
352 STRINGLIB_FILL(p
+ nchars
+ n_lpadding
, fill_char
, n_rpadding
);
354 /* Pointer to the user content. */
355 return p
+ n_lpadding
;
358 #if defined FORMAT_FLOAT || defined FORMAT_LONG || defined FORMAT_COMPLEX
359 /************************************************************************/
360 /*********** common routines for numeric formatting *********************/
361 /************************************************************************/
363 /* Locale type codes. */
364 #define LT_CURRENT_LOCALE 0
365 #define LT_DEFAULT_LOCALE 1
366 #define LT_NO_LOCALE 2
368 /* Locale info needed for formatting integers and the part of floats
369 before and including the decimal. Note that locales only support
370 8-bit chars, not unicode. */
377 /* describes the layout for an integer, see the comment in
378 calc_number_widths() for details */
380 Py_ssize_t n_lpadding
;
382 Py_ssize_t n_spadding
;
383 Py_ssize_t n_rpadding
;
385 Py_ssize_t n_sign
; /* number of digits needed for sign (0/1) */
386 Py_ssize_t n_grouped_digits
; /* Space taken up by the digits, including
387 any grouping chars. */
388 Py_ssize_t n_decimal
; /* 0 if only an integer */
389 Py_ssize_t n_remainder
; /* Digits in decimal and/or exponent part,
390 excluding the decimal itself, if
393 /* These 2 are not the widths of fields, but are needed by
394 STRINGLIB_GROUPING. */
395 Py_ssize_t n_digits
; /* The number of digits before a decimal
397 Py_ssize_t n_min_width
; /* The min_width we used when we computed
398 the n_grouped_digits width. */
402 /* Given a number of the form:
404 where ptr points to the start and end points to the end, find where
405 the integer part ends. This could be a decimal, an exponent, both,
407 If a decimal point is present, set *has_decimal and increment
409 Results are undefined (but shouldn't crash) for improperly
413 parse_number(STRINGLIB_CHAR
*ptr
, Py_ssize_t len
,
414 Py_ssize_t
*n_remainder
, int *has_decimal
)
416 STRINGLIB_CHAR
*end
= ptr
+ len
;
417 STRINGLIB_CHAR
*remainder
;
419 while (ptr
<end
&& isdigit(*ptr
))
423 /* Does remainder start with a decimal point? */
424 *has_decimal
= ptr
<end
&& *remainder
== '.';
426 /* Skip the decimal point. */
430 *n_remainder
= end
- remainder
;
433 /* not all fields of format are used. for example, precision is
434 unused. should this take discrete params in order to be more clear
435 about what it does? or is passing a single format parameter easier
436 and more efficient enough to justify a little obfuscation? */
438 calc_number_widths(NumberFieldWidths
*spec
, Py_ssize_t n_prefix
,
439 STRINGLIB_CHAR sign_char
, STRINGLIB_CHAR
*number
,
440 Py_ssize_t n_number
, Py_ssize_t n_remainder
,
441 int has_decimal
, const LocaleInfo
*locale
,
442 const InternalFormatSpec
*format
)
444 Py_ssize_t n_non_digit_non_padding
;
445 Py_ssize_t n_padding
;
447 spec
->n_digits
= n_number
- n_remainder
- (has_decimal
?1:0);
448 spec
->n_lpadding
= 0;
449 spec
->n_prefix
= n_prefix
;
450 spec
->n_decimal
= has_decimal
? strlen(locale
->decimal_point
) : 0;
451 spec
->n_remainder
= n_remainder
;
452 spec
->n_spadding
= 0;
453 spec
->n_rpadding
= 0;
457 /* the output will look like:
459 | <lpadding> <sign> <prefix> <spadding> <grouped_digits> <decimal> <remainder> <rpadding> |
462 sign is computed from format->sign and the actual
465 prefix is given (it's for the '0x' prefix)
467 digits is already known
469 the total width is either given, or computed from the
472 only one of lpadding, spadding, and rpadding can be non-zero,
473 and it's calculated from the width and other fields
476 /* compute the various parts we're going to write */
477 switch (format
->sign
) {
479 /* always put a + or - */
481 spec
->sign
= (sign_char
== '-' ? '-' : '+');
485 spec
->sign
= (sign_char
== '-' ? '-' : ' ');
488 /* Not specified, or the default (-) */
489 if (sign_char
== '-') {
495 /* The number of chars used for non-digits and non-padding. */
496 n_non_digit_non_padding
= spec
->n_sign
+ spec
->n_prefix
+ spec
->n_decimal
+
499 /* min_width can go negative, that's okay. format->width == -1 means
501 if (format
->fill_char
== '0' && format
->align
== '=')
502 spec
->n_min_width
= format
->width
- n_non_digit_non_padding
;
504 spec
->n_min_width
= 0;
506 if (spec
->n_digits
== 0)
507 /* This case only occurs when using 'c' formatting, we need
508 to special case it because the grouping code always wants
509 to have at least one character. */
510 spec
->n_grouped_digits
= 0;
512 spec
->n_grouped_digits
= STRINGLIB_GROUPING(NULL
, 0, NULL
,
516 locale
->thousands_sep
);
518 /* Given the desired width and the total of digit and non-digit
519 space we consume, see if we need any padding. format->width can
520 be negative (meaning no padding), but this code still works in
522 n_padding
= format
->width
-
523 (n_non_digit_non_padding
+ spec
->n_grouped_digits
);
525 /* Some padding is needed. Determine if it's left, space, or right. */
526 switch (format
->align
) {
528 spec
->n_rpadding
= n_padding
;
531 spec
->n_lpadding
= n_padding
/ 2;
532 spec
->n_rpadding
= n_padding
- spec
->n_lpadding
;
535 spec
->n_spadding
= n_padding
;
538 spec
->n_lpadding
= n_padding
;
541 /* Shouldn't get here, but treat it as '>' */
542 spec
->n_lpadding
= n_padding
;
547 return spec
->n_lpadding
+ spec
->n_sign
+ spec
->n_prefix
+
548 spec
->n_spadding
+ spec
->n_grouped_digits
+ spec
->n_decimal
+
549 spec
->n_remainder
+ spec
->n_rpadding
;
552 /* Fill in the digit parts of a numbers's string representation,
553 as determined in calc_number_widths().
554 No error checking, since we know the buffer is the correct size. */
556 fill_number(STRINGLIB_CHAR
*buf
, const NumberFieldWidths
*spec
,
557 STRINGLIB_CHAR
*digits
, Py_ssize_t n_digits
,
558 STRINGLIB_CHAR
*prefix
, STRINGLIB_CHAR fill_char
,
559 LocaleInfo
*locale
, int toupper
)
561 /* Used to keep track of digits, decimal, and remainder. */
562 STRINGLIB_CHAR
*p
= digits
;
568 if (spec
->n_lpadding
) {
569 STRINGLIB_FILL(buf
, fill_char
, spec
->n_lpadding
);
570 buf
+= spec
->n_lpadding
;
572 if (spec
->n_sign
== 1) {
575 if (spec
->n_prefix
) {
578 spec
->n_prefix
* sizeof(STRINGLIB_CHAR
));
581 for (t
= 0; t
< spec
->n_prefix
; ++t
)
582 buf
[t
] = STRINGLIB_TOUPPER(buf
[t
]);
584 buf
+= spec
->n_prefix
;
586 if (spec
->n_spadding
) {
587 STRINGLIB_FILL(buf
, fill_char
, spec
->n_spadding
);
588 buf
+= spec
->n_spadding
;
591 /* Only for type 'c' special case, it has no digits. */
592 if (spec
->n_digits
!= 0) {
593 /* Fill the digits with InsertThousandsGrouping. */
597 STRINGLIB_GROUPING(buf
, spec
->n_grouped_digits
, digits
,
598 spec
->n_digits
, spec
->n_min_width
,
599 locale
->grouping
, locale
->thousands_sep
);
601 assert(r
== spec
->n_grouped_digits
);
607 for (t
= 0; t
< spec
->n_grouped_digits
; ++t
)
608 buf
[t
] = STRINGLIB_TOUPPER(buf
[t
]);
610 buf
+= spec
->n_grouped_digits
;
612 if (spec
->n_decimal
) {
614 for (t
= 0; t
< spec
->n_decimal
; ++t
)
615 buf
[t
] = locale
->decimal_point
[t
];
616 buf
+= spec
->n_decimal
;
620 if (spec
->n_remainder
) {
621 memcpy(buf
, p
, spec
->n_remainder
* sizeof(STRINGLIB_CHAR
));
622 buf
+= spec
->n_remainder
;
623 p
+= spec
->n_remainder
;
626 if (spec
->n_rpadding
) {
627 STRINGLIB_FILL(buf
, fill_char
, spec
->n_rpadding
);
628 buf
+= spec
->n_rpadding
;
632 static char no_grouping
[1] = {CHAR_MAX
};
634 /* Find the decimal point character(s?), thousands_separator(s?), and
635 grouping description, either for the current locale if type is
636 LT_CURRENT_LOCALE, a hard-coded locale if LT_DEFAULT_LOCALE, or
637 none if LT_NO_LOCALE. */
639 get_locale_info(int type
, LocaleInfo
*locale_info
)
642 case LT_CURRENT_LOCALE
: {
643 struct lconv
*locale_data
= localeconv();
644 locale_info
->decimal_point
= locale_data
->decimal_point
;
645 locale_info
->thousands_sep
= locale_data
->thousands_sep
;
646 locale_info
->grouping
= locale_data
->grouping
;
649 case LT_DEFAULT_LOCALE
:
650 locale_info
->decimal_point
= ".";
651 locale_info
->thousands_sep
= ",";
652 locale_info
->grouping
= "\3"; /* Group every 3 characters. The
653 (implicit) trailing 0 means repeat
657 locale_info
->decimal_point
= ".";
658 locale_info
->thousands_sep
= "";
659 locale_info
->grouping
= no_grouping
;
666 #endif /* FORMAT_FLOAT || FORMAT_LONG || FORMAT_COMPLEX */
668 /************************************************************************/
669 /*********** string formatting ******************************************/
670 /************************************************************************/
673 format_string_internal(PyObject
*value
, const InternalFormatSpec
*format
)
679 Py_ssize_t len
= STRINGLIB_LEN(value
);
680 PyObject
*result
= NULL
;
682 /* sign is not allowed on strings */
683 if (format
->sign
!= '\0') {
684 PyErr_SetString(PyExc_ValueError
,
685 "Sign not allowed in string format specifier");
689 /* alternate is not allowed on strings */
690 if (format
->alternate
) {
691 PyErr_SetString(PyExc_ValueError
,
692 "Alternate form (#) not allowed in string format "
697 /* '=' alignment not allowed on strings */
698 if (format
->align
== '=') {
699 PyErr_SetString(PyExc_ValueError
,
700 "'=' alignment not allowed "
701 "in string format specifier");
705 /* if precision is specified, output no more that format.precision
707 if (format
->precision
>= 0 && len
>= format
->precision
) {
708 len
= format
->precision
;
711 calc_padding(len
, format
->width
, format
->align
, &lpad
, &rpad
, &total
);
713 /* allocate the resulting string */
714 result
= STRINGLIB_NEW(NULL
, total
);
718 /* Write into that space. First the padding. */
719 p
= fill_padding(STRINGLIB_STR(result
), len
,
720 format
->fill_char
, lpad
, rpad
);
722 /* Then the source string. */
723 memcpy(p
, STRINGLIB_STR(value
), len
* sizeof(STRINGLIB_CHAR
));
730 /************************************************************************/
731 /*********** long formatting ********************************************/
732 /************************************************************************/
734 #if defined FORMAT_LONG || defined FORMAT_INT
736 (*IntOrLongToString
)(PyObject
*value
, int base
);
739 format_int_or_long_internal(PyObject
*value
, const InternalFormatSpec
*format
,
740 IntOrLongToString tostring
)
742 PyObject
*result
= NULL
;
743 PyObject
*tmp
= NULL
;
744 STRINGLIB_CHAR
*pnumeric_chars
;
745 STRINGLIB_CHAR numeric_char
;
746 STRINGLIB_CHAR sign_char
= '\0';
747 Py_ssize_t n_digits
; /* count of digits need from the computed
749 Py_ssize_t n_remainder
= 0; /* Used only for 'c' formatting, which
750 produces non-digits */
751 Py_ssize_t n_prefix
= 0; /* Count of prefix chars, (e.g., '0x') */
753 STRINGLIB_CHAR
*prefix
= NULL
;
754 NumberFieldWidths spec
;
757 /* Locale settings, either from the actual locale or
758 from a hard-code pseudo-locale */
761 /* no precision allowed on integers */
762 if (format
->precision
!= -1) {
763 PyErr_SetString(PyExc_ValueError
,
764 "Precision not allowed in integer format specifier");
768 /* special case for character formatting */
769 if (format
->type
== 'c') {
770 /* error to specify a sign */
771 if (format
->sign
!= '\0') {
772 PyErr_SetString(PyExc_ValueError
,
773 "Sign not allowed with integer"
774 " format specifier 'c'");
778 /* Error to specify a comma. */
779 if (format
->thousands_separators
) {
780 PyErr_SetString(PyExc_ValueError
,
781 "Thousands separators not allowed with integer"
782 " format specifier 'c'");
786 /* taken from unicodeobject.c formatchar() */
787 /* Integer input truncated to a character */
788 /* XXX: won't work for int */
789 x
= PyLong_AsLong(value
);
790 if (x
== -1 && PyErr_Occurred())
792 #ifdef Py_UNICODE_WIDE
793 if (x
< 0 || x
> 0x10ffff) {
794 PyErr_SetString(PyExc_OverflowError
,
795 "%c arg not in range(0x110000) "
796 "(wide Python build)");
800 if (x
< 0 || x
> 0xffff) {
801 PyErr_SetString(PyExc_OverflowError
,
802 "%c arg not in range(0x10000) "
803 "(narrow Python build)");
807 numeric_char
= (STRINGLIB_CHAR
)x
;
808 pnumeric_chars
= &numeric_char
;
811 /* As a sort-of hack, we tell calc_number_widths that we only
812 have "remainder" characters. calc_number_widths thinks
813 these are characters that don't get formatted, only copied
814 into the output string. We do this for 'c' formatting,
815 because the characters are likely to be non-digits. */
820 int leading_chars_to_skip
= 0; /* Number of characters added by
821 PyNumber_ToBase that we want to
824 /* Compute the base and how many characters will be added by
826 switch (format
->type
) {
829 leading_chars_to_skip
= 2; /* 0b */
833 leading_chars_to_skip
= 2; /* 0o */
838 leading_chars_to_skip
= 2; /* 0x */
840 default: /* shouldn't be needed, but stops a compiler warning */
847 /* The number of prefix chars is the same as the leading
849 if (format
->alternate
)
850 n_prefix
= leading_chars_to_skip
;
852 /* Do the hard part, converting to a string in a given base */
853 tmp
= tostring(value
, base
);
857 pnumeric_chars
= STRINGLIB_STR(tmp
);
858 n_digits
= STRINGLIB_LEN(tmp
);
860 prefix
= pnumeric_chars
;
862 /* Remember not to modify what pnumeric_chars points to. it
863 might be interned. Only modify it after we copy it into a
864 newly allocated output buffer. */
866 /* Is a sign character present in the output? If so, remember it
868 if (pnumeric_chars
[0] == '-') {
869 sign_char
= pnumeric_chars
[0];
871 ++leading_chars_to_skip
;
874 /* Skip over the leading chars (0x, 0b, etc.) */
875 n_digits
-= leading_chars_to_skip
;
876 pnumeric_chars
+= leading_chars_to_skip
;
879 /* Determine the grouping, separator, and decimal point, if any. */
880 get_locale_info(format
->type
== 'n' ? LT_CURRENT_LOCALE
:
881 (format
->thousands_separators
?
886 /* Calculate how much memory we'll need. */
887 n_total
= calc_number_widths(&spec
, n_prefix
, sign_char
, pnumeric_chars
,
888 n_digits
, n_remainder
, 0, &locale
, format
);
890 /* Allocate the memory. */
891 result
= STRINGLIB_NEW(NULL
, n_total
);
895 /* Populate the memory. */
896 fill_number(STRINGLIB_STR(result
), &spec
, pnumeric_chars
, n_digits
,
897 prefix
, format
->fill_char
, &locale
, format
->type
== 'X');
903 #endif /* defined FORMAT_LONG || defined FORMAT_INT */
905 /************************************************************************/
906 /*********** float formatting *******************************************/
907 /************************************************************************/
910 #if STRINGLIB_IS_UNICODE
912 strtounicode(Py_UNICODE
*buffer
, const char *charbuffer
, Py_ssize_t len
)
915 for (i
= 0; i
< len
; ++i
)
916 buffer
[i
] = (Py_UNICODE
)charbuffer
[i
];
920 /* much of this is taken from unicodeobject.c */
922 format_float_internal(PyObject
*value
,
923 const InternalFormatSpec
*format
)
925 char *buf
= NULL
; /* buffer returned from PyOS_double_to_string */
927 Py_ssize_t n_remainder
;
931 Py_ssize_t precision
;
932 Py_ssize_t default_precision
= 6;
933 STRINGLIB_CHAR type
= format
->type
;
936 NumberFieldWidths spec
;
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. */
942 #if STRINGLIB_IS_UNICODE
943 Py_UNICODE
*unicode_tmp
= NULL
;
946 /* Locale settings, either from the actual locale or
947 from a hard-code pseudo-locale */
950 if (format
->precision
> INT_MAX
) {
951 PyErr_SetString(PyExc_ValueError
, "precision too big");
954 precision
= (int)format
->precision
;
956 /* Alternate is not allowed on floats. */
957 if (format
->alternate
) {
958 PyErr_SetString(PyExc_ValueError
,
959 "Alternate form (#) not allowed in float format "
965 /* Omitted type specifier. This is like 'g' but with at least one
966 digit after the decimal point, and different default precision.*/
968 default_precision
= PyFloat_STR_PRECISION
;
969 flags
|= Py_DTSF_ADD_DOT_0
;
973 /* 'n' is the same as 'g', except for the locale used to
974 format the result. We take care of that later. */
977 val
= PyFloat_AsDouble(value
);
978 if (val
== -1.0 && PyErr_Occurred())
988 precision
= default_precision
;
990 /* Cast "type", because if we're in unicode we need to pass a
991 8-bit char. This is safe, because we've restricted what "type"
993 buf
= PyOS_double_to_string(val
, (char)type
, precision
, flags
,
997 n_digits
= strlen(buf
);
1000 /* We know that buf has a trailing zero (since we just called
1001 strlen() on it), and we don't use that fact any more. So we
1002 can just write over the trailing zero. */
1003 buf
[n_digits
] = '%';
1007 /* Since there is no unicode version of PyOS_double_to_string,
1008 just use the 8 bit version and then convert to unicode. */
1009 #if STRINGLIB_IS_UNICODE
1010 unicode_tmp
= (Py_UNICODE
*)PyMem_Malloc((n_digits
)*sizeof(Py_UNICODE
));
1011 if (unicode_tmp
== NULL
) {
1015 strtounicode(unicode_tmp
, buf
, n_digits
);
1021 /* Is a sign character present in the output? If so, remember it
1029 /* Determine if we have any "remainder" (after the digits, might include
1030 decimal or exponent or both (or neither)) */
1031 parse_number(p
, n_digits
, &n_remainder
, &has_decimal
);
1033 /* Determine the grouping, separator, and decimal point, if any. */
1034 get_locale_info(format
->type
== 'n' ? LT_CURRENT_LOCALE
:
1035 (format
->thousands_separators
?
1040 /* Calculate how much memory we'll need. */
1041 n_total
= calc_number_widths(&spec
, 0, sign_char
, p
, n_digits
,
1042 n_remainder
, has_decimal
, &locale
, format
);
1044 /* Allocate the memory. */
1045 result
= STRINGLIB_NEW(NULL
, n_total
);
1049 /* Populate the memory. */
1050 fill_number(STRINGLIB_STR(result
), &spec
, p
, n_digits
, NULL
,
1051 format
->fill_char
, &locale
, 0);
1055 #if STRINGLIB_IS_UNICODE
1056 PyMem_Free(unicode_tmp
);
1060 #endif /* FORMAT_FLOAT */
1062 /************************************************************************/
1063 /*********** complex formatting *****************************************/
1064 /************************************************************************/
1066 #ifdef FORMAT_COMPLEX
1069 format_complex_internal(PyObject
*value
,
1070 const InternalFormatSpec
*format
)
1074 char *re_buf
= NULL
; /* buffer returned from PyOS_double_to_string */
1075 char *im_buf
= NULL
; /* buffer returned from PyOS_double_to_string */
1077 InternalFormatSpec tmp_format
= *format
;
1078 Py_ssize_t n_re_digits
;
1079 Py_ssize_t n_im_digits
;
1080 Py_ssize_t n_re_remainder
;
1081 Py_ssize_t n_im_remainder
;
1082 Py_ssize_t n_re_total
;
1083 Py_ssize_t n_im_total
;
1086 Py_ssize_t precision
;
1087 Py_ssize_t default_precision
= 6;
1088 STRINGLIB_CHAR type
= format
->type
;
1089 STRINGLIB_CHAR
*p_re
;
1090 STRINGLIB_CHAR
*p_im
;
1091 NumberFieldWidths re_spec
;
1092 NumberFieldWidths im_spec
;
1094 PyObject
*result
= NULL
;
1096 STRINGLIB_CHAR re_sign_char
= '\0';
1097 STRINGLIB_CHAR im_sign_char
= '\0';
1098 int re_float_type
; /* Used to see if we have a nan, inf, or regular float. */
1106 #if STRINGLIB_IS_UNICODE
1107 Py_UNICODE
*re_unicode_tmp
= NULL
;
1108 Py_UNICODE
*im_unicode_tmp
= NULL
;
1111 /* Locale settings, either from the actual locale or
1112 from a hard-code pseudo-locale */
1115 if (format
->precision
> INT_MAX
) {
1116 PyErr_SetString(PyExc_ValueError
, "precision too big");
1119 precision
= (int)format
->precision
;
1121 /* Alternate is not allowed on complex. */
1122 if (format
->alternate
) {
1123 PyErr_SetString(PyExc_ValueError
,
1124 "Alternate form (#) not allowed in complex format "
1129 /* Neither is zero pading. */
1130 if (format
->fill_char
== '0') {
1131 PyErr_SetString(PyExc_ValueError
,
1132 "Zero padding is not allowed in complex format "
1137 /* Neither is '=' alignment . */
1138 if (format
->align
== '=') {
1139 PyErr_SetString(PyExc_ValueError
,
1140 "'=' alignment flag is not allowed in complex format "
1145 re
= PyComplex_RealAsDouble(value
);
1146 if (re
== -1.0 && PyErr_Occurred())
1148 im
= PyComplex_ImagAsDouble(value
);
1149 if (im
== -1.0 && PyErr_Occurred())
1153 /* Omitted type specifier. Should be like str(self). */
1155 default_precision
= PyFloat_STR_PRECISION
;
1156 if (re
== 0.0 && copysign(1.0, re
) == 1.0)
1163 /* 'n' is the same as 'g', except for the locale used to
1164 format the result. We take care of that later. */
1168 precision
= default_precision
;
1170 /* Cast "type", because if we're in unicode we need to pass a
1171 8-bit char. This is safe, because we've restricted what "type"
1173 re_buf
= PyOS_double_to_string(re
, (char)type
, precision
, flags
,
1177 im_buf
= PyOS_double_to_string(im
, (char)type
, precision
, flags
,
1182 n_re_digits
= strlen(re_buf
);
1183 n_im_digits
= strlen(im_buf
);
1185 /* Since there is no unicode version of PyOS_double_to_string,
1186 just use the 8 bit version and then convert to unicode. */
1187 #if STRINGLIB_IS_UNICODE
1188 re_unicode_tmp
= (Py_UNICODE
*)PyMem_Malloc((n_re_digits
)*sizeof(Py_UNICODE
));
1189 if (re_unicode_tmp
== NULL
) {
1193 strtounicode(re_unicode_tmp
, re_buf
, n_re_digits
);
1194 p_re
= re_unicode_tmp
;
1196 im_unicode_tmp
= (Py_UNICODE
*)PyMem_Malloc((n_im_digits
)*sizeof(Py_UNICODE
));
1197 if (im_unicode_tmp
== NULL
) {
1201 strtounicode(im_unicode_tmp
, im_buf
, n_im_digits
);
1202 p_im
= im_unicode_tmp
;
1208 /* Is a sign character present in the output? If so, remember it
1211 re_sign_char
= *p_re
;
1216 im_sign_char
= *p_im
;
1221 /* Determine if we have any "remainder" (after the digits, might include
1222 decimal or exponent or both (or neither)) */
1223 parse_number(p_re
, n_re_digits
, &n_re_remainder
, &re_has_decimal
);
1224 parse_number(p_im
, n_im_digits
, &n_im_remainder
, &im_has_decimal
);
1226 /* Determine the grouping, separator, and decimal point, if any. */
1227 get_locale_info(format
->type
== 'n' ? LT_CURRENT_LOCALE
:
1228 (format
->thousands_separators
?
1233 /* Turn off any padding. We'll do it later after we've composed
1234 the numbers without padding. */
1235 tmp_format
.fill_char
= '\0';
1236 tmp_format
.align
= '<';
1237 tmp_format
.width
= -1;
1239 /* Calculate how much memory we'll need. */
1240 n_re_total
= calc_number_widths(&re_spec
, 0, re_sign_char
, p_re
,
1241 n_re_digits
, n_re_remainder
,
1242 re_has_decimal
, &locale
, &tmp_format
);
1244 /* Same formatting, but always include a sign, unless the real part is
1245 * going to be omitted, in which case we use whatever sign convention was
1246 * requested by the original format. */
1248 tmp_format
.sign
= '+';
1249 n_im_total
= calc_number_widths(&im_spec
, 0, im_sign_char
, p_im
,
1250 n_im_digits
, n_im_remainder
,
1251 im_has_decimal
, &locale
, &tmp_format
);
1256 /* Add 1 for the 'j', and optionally 2 for parens. */
1257 calc_padding(n_re_total
+ n_im_total
+ 1 + add_parens
* 2,
1258 format
->width
, format
->align
, &lpad
, &rpad
, &total
);
1260 result
= STRINGLIB_NEW(NULL
, total
);
1264 /* Populate the memory. First, the padding. */
1265 p
= fill_padding(STRINGLIB_STR(result
),
1266 n_re_total
+ n_im_total
+ 1 + add_parens
* 2,
1267 format
->fill_char
, lpad
, rpad
);
1273 fill_number(p
, &re_spec
, p_re
, n_re_digits
, NULL
, 0, &locale
, 0);
1276 fill_number(p
, &im_spec
, p_im
, n_im_digits
, NULL
, 0, &locale
, 0);
1286 #if STRINGLIB_IS_UNICODE
1287 PyMem_Free(re_unicode_tmp
);
1288 PyMem_Free(im_unicode_tmp
);
1292 #endif /* FORMAT_COMPLEX */
1294 /************************************************************************/
1295 /*********** built in formatters ****************************************/
1296 /************************************************************************/
1298 FORMAT_STRING(PyObject
*obj
,
1299 STRINGLIB_CHAR
*format_spec
,
1300 Py_ssize_t format_spec_len
)
1302 InternalFormatSpec format
;
1303 PyObject
*result
= NULL
;
1305 /* check for the special case of zero length format spec, make
1306 it equivalent to str(obj) */
1307 if (format_spec_len
== 0) {
1308 result
= STRINGLIB_TOSTR(obj
);
1312 /* parse the format_spec */
1313 if (!parse_internal_render_format_spec(format_spec
, format_spec_len
,
1317 /* type conversion? */
1318 switch (format
.type
) {
1320 /* no type conversion needed, already a string. do the formatting */
1321 result
= format_string_internal(obj
, &format
);
1325 unknown_presentation_type(format
.type
, obj
->ob_type
->tp_name
);
1333 #if defined FORMAT_LONG || defined FORMAT_INT
1335 format_int_or_long(PyObject
* obj
,
1336 STRINGLIB_CHAR
*format_spec
,
1337 Py_ssize_t format_spec_len
,
1338 IntOrLongToString tostring
)
1340 PyObject
*result
= NULL
;
1341 PyObject
*tmp
= NULL
;
1342 InternalFormatSpec format
;
1344 /* check for the special case of zero length format spec, make
1345 it equivalent to str(obj) */
1346 if (format_spec_len
== 0) {
1347 result
= STRINGLIB_TOSTR(obj
);
1351 /* parse the format_spec */
1352 if (!parse_internal_render_format_spec(format_spec
,
1357 /* type conversion? */
1358 switch (format
.type
) {
1366 /* no type conversion needed, already an int (or long). do
1368 result
= format_int_or_long_internal(obj
, &format
, tostring
);
1378 /* convert to float */
1379 tmp
= PyNumber_Float(obj
);
1382 result
= format_float_internal(tmp
, &format
);
1387 unknown_presentation_type(format
.type
, obj
->ob_type
->tp_name
);
1395 #endif /* FORMAT_LONG || defined FORMAT_INT */
1398 /* Need to define long_format as a function that will convert a long
1399 to a string. In 3.0, _PyLong_Format has the correct signature. In
1400 2.x, we need to fudge a few parameters */
1401 #if PY_VERSION_HEX >= 0x03000000
1402 #define long_format _PyLong_Format
1405 long_format(PyObject
* value
, int base
)
1407 /* Convert to base, don't add trailing 'L', and use the new octal
1408 format. We already know this is a long object */
1409 assert(PyLong_Check(value
));
1410 /* convert to base, don't add 'L', and use the new octal format */
1411 return _PyLong_Format(value
, base
, 0, 1);
1416 FORMAT_LONG(PyObject
*obj
,
1417 STRINGLIB_CHAR
*format_spec
,
1418 Py_ssize_t format_spec_len
)
1420 return format_int_or_long(obj
, format_spec
, format_spec_len
,
1423 #endif /* FORMAT_LONG */
1426 /* this is only used for 2.x, not 3.0 */
1428 int_format(PyObject
* value
, int base
)
1430 /* Convert to base, and use the new octal format. We already
1431 know this is an int object */
1432 assert(PyInt_Check(value
));
1433 return _PyInt_Format((PyIntObject
*)value
, base
, 1);
1437 FORMAT_INT(PyObject
*obj
,
1438 STRINGLIB_CHAR
*format_spec
,
1439 Py_ssize_t format_spec_len
)
1441 return format_int_or_long(obj
, format_spec
, format_spec_len
,
1444 #endif /* FORMAT_INT */
1448 FORMAT_FLOAT(PyObject
*obj
,
1449 STRINGLIB_CHAR
*format_spec
,
1450 Py_ssize_t format_spec_len
)
1452 PyObject
*result
= NULL
;
1453 InternalFormatSpec format
;
1455 /* check for the special case of zero length format spec, make
1456 it equivalent to str(obj) */
1457 if (format_spec_len
== 0) {
1458 result
= STRINGLIB_TOSTR(obj
);
1462 /* parse the format_spec */
1463 if (!parse_internal_render_format_spec(format_spec
,
1465 &format
, '\0', '>'))
1468 /* type conversion? */
1469 switch (format
.type
) {
1470 case '\0': /* No format code: like 'g', but with at least one decimal. */
1479 /* no conversion, already a float. do the formatting */
1480 result
= format_float_internal(obj
, &format
);
1485 unknown_presentation_type(format
.type
, obj
->ob_type
->tp_name
);
1492 #endif /* FORMAT_FLOAT */
1494 #ifdef FORMAT_COMPLEX
1496 FORMAT_COMPLEX(PyObject
*obj
,
1497 STRINGLIB_CHAR
*format_spec
,
1498 Py_ssize_t format_spec_len
)
1500 PyObject
*result
= NULL
;
1501 InternalFormatSpec format
;
1503 /* check for the special case of zero length format spec, make
1504 it equivalent to str(obj) */
1505 if (format_spec_len
== 0) {
1506 result
= STRINGLIB_TOSTR(obj
);
1510 /* parse the format_spec */
1511 if (!parse_internal_render_format_spec(format_spec
,
1513 &format
, '\0', '>'))
1516 /* type conversion? */
1517 switch (format
.type
) {
1518 case '\0': /* No format code: like 'g', but with at least one decimal. */
1526 /* no conversion, already a complex. do the formatting */
1527 result
= format_complex_internal(obj
, &format
);
1532 unknown_presentation_type(format
.type
, obj
->ob_type
->tp_name
);
1539 #endif /* FORMAT_COMPLEX */