diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index 1c19879007f..a2e25420758 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -73,6 +73,43 @@ The following functions provide locale-independent string to number conversions. The return value is a pointer to *buffer* with the converted string or NULL if the conversion failed. + .. deprecated:: 3.1 + Use :cfunc:`PyOS_double_to_string` instead. + + +.. cfunction:: char* PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype) + + Convert a :ctype:`double` *val* to a string using supplied + *format_code*, *precision*, and *flags*. + + *format_code* must be one of ``'e'``, ``'E'``, ``'f'``, ``'F'``, ``'g'``, + ``'G'``, ``'s'``, or ``'r'``. For ``'s'`` and ``'r'``, the supplied + *precision* must be 0 and is ignored. These specify the standard + :func:`str` and :func:`repr` formats, respectively. + + *flags* can be zero or more of the values *Py_DTSF_SIGN*, + *Py_DTSF_ADD_DOT_0*, or *Py_DTSF_ALT*, or-ed together: + + * *Py_DTSF_SIGN* means to always precede the returned string with a sign + character, even if *val* is non-negative. + + * *Py_DTSF_ADD_DOT_0* means to ensure that the returned string will not look + like an integer. + + * *Py_DTSF_ALT* means to apply "alternate" formatting rules. See the + documentation for the :cfunc:`PyOS_snprintf` ``'#'`` specifier for + details. + + If *ptype* is non-NULL, then the value it points to will be set to one of + *Py_DTST_FINITE*, *Py_DTST_INFINITE*, or *Py_DTST_NAN*, signifying that + *val* is a finite number, an infinite number, or not a number, respectively. + + The return value is a pointer to *buffer* with the converted string or + *NULL* if the conversion failed. The caller is responsible for freeing the + returned string by calling :cfunc:`PyMem_Free`. + + .. versionadded:: 3.1 + .. cfunction:: double PyOS_ascii_atof(const char *nptr) diff --git a/Misc/NEWS b/Misc/NEWS index 8d98720172a..2240c6210df 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ What's New in Python 3.1 beta 1? Core and Builtins ----------------- +- Issue #5835: Deprecate PyOS_ascii_formatd. + - Issue #4971: Fix titlecase for characters that are their own titlecase, but not their own uppercase. diff --git a/Python/pystrtod.c b/Python/pystrtod.c index b5dd93d17a8..872cc37ed7c 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -433,7 +433,7 @@ ensure_decimal_point(char* buffer, size_t buf_size) * Return value: The pointer to the buffer with the converted string. **/ char * -PyOS_ascii_formatd(char *buffer, +_PyOS_ascii_formatd(char *buffer, size_t buf_size, const char *format, double d) @@ -508,6 +508,20 @@ PyOS_ascii_formatd(char *buffer, return buffer; } +char * +PyOS_ascii_formatd(char *buffer, + size_t buf_size, + const char *format, + double d) +{ + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "PyOS_ascii_formatd is deprecated, " + "use PyOS_double_to_string instead", 1) < 0) + return NULL; + + return _PyOS_ascii_formatd(buffer, buf_size, format, d); +} + #ifdef PY_NO_SHORT_FLOAT_REPR /* The fallback code to use if _Py_dg_dtoa is not available. */ @@ -638,8 +652,10 @@ PyAPI_FUNC(char *) PyOS_double_to_string(double val, if ((flags & Py_DTSF_ADD_DOT_0) && (format_code != 'e')) format_code = 'Z'; - PyOS_snprintf(format, 32, "%%%s.%i%c", (flags & Py_DTSF_ALT ? "#" : ""), precision, format_code); - PyOS_ascii_formatd(buf, sizeof(buf), format, val); + PyOS_snprintf(format, sizeof(format), "%%%s.%i%c", + (flags & Py_DTSF_ALT ? "#" : ""), precision, + format_code); + _PyOS_ascii_formatd(buf, sizeof(buf), format, val); /* remove trailing zeros if necessary */ if (strip_trailing_zeros) remove_trailing_zeros(buf);