Commit 09823a2e authored by Mark Dickinson's avatar Mark Dickinson

Deprecate PyOS_ascii_strtod and PyOS_ascii_atof, and document the replacement...

Deprecate PyOS_ascii_strtod and PyOS_ascii_atof, and document the replacement function PyOS_string_to_double.
parent ba26b391
...@@ -51,6 +51,40 @@ The return value (*rv*) for these functions should be interpreted as follows: ...@@ -51,6 +51,40 @@ The return value (*rv*) for these functions should be interpreted as follows:
The following functions provide locale-independent string to number conversions. The following functions provide locale-independent string to number conversions.
.. cfunction:: double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)
Convert a string ``s`` to a :ctype:`double`, raising a Python
exception on failure. The set of accepted strings corresponds to
the set of strings accepted by Python's :func:`float` constructor,
except that ``s`` must not have leading or trailing whitespace.
The conversion is independent of the current locale.
If ``endptr`` is ``NULL``, convert the whole string. Raise
ValueError and return ``-1.0`` if the string is not a valid
representation of a floating-point number.
If endptr is not ``NULL``, convert as much of the string as
possible and set ``*endptr`` to point to the first unconverted
character. If no initial segment of the string is the valid
representation of a floating-point number, set ``*endptr`` to point
to the beginning of the string, raise ValueError, and return
``-1.0``.
If ``s`` represents a value that is too large to store in a float
(for example, ``"1e500"`` is such a string on many platforms) then
if ``overflow_exception`` is ``NULL`` return ``Py_HUGE_VAL`` (with
an appropriate sign) and don't set any exception. Otherwise,
``overflow_exception`` must point to a Python exception object;
raise that exception and return ``-1.0``. In both cases, set
``*endptr`` to point to the first character after the converted value.
If any other error occurs during the conversion (for example an
out-of-memory error), set the appropriate Python exception and
return ``-1.0``.
.. versionadded:: 2.7
.. cfunction:: double PyOS_ascii_strtod(const char *nptr, char **endptr) .. cfunction:: double PyOS_ascii_strtod(const char *nptr, char **endptr)
Convert a string to a :ctype:`double`. This function behaves like the Standard C Convert a string to a :ctype:`double`. This function behaves like the Standard C
...@@ -60,9 +94,13 @@ The following functions provide locale-independent string to number conversions. ...@@ -60,9 +94,13 @@ The following functions provide locale-independent string to number conversions.
:cfunc:`PyOS_ascii_strtod` should typically be used for reading configuration :cfunc:`PyOS_ascii_strtod` should typically be used for reading configuration
files or other non-user input that should be locale independent. files or other non-user input that should be locale independent.
See the Unix man page :manpage:`strtod(2)` for details.
.. versionadded:: 2.4 .. versionadded:: 2.4
See the Unix man page :manpage:`strtod(2)` for details. .. deprecated:: 2.7
Use :cfunc:`PyOS_string_to_double` instead.
.. cfunction:: char* PyOS_ascii_formatd(char *buffer, size_t buf_len, const char *format, double d) .. cfunction:: char* PyOS_ascii_formatd(char *buffer, size_t buf_len, const char *format, double d)
...@@ -119,9 +157,12 @@ The following functions provide locale-independent string to number conversions. ...@@ -119,9 +157,12 @@ The following functions provide locale-independent string to number conversions.
Convert a string to a :ctype:`double` in a locale-independent way. Convert a string to a :ctype:`double` in a locale-independent way.
See the Unix man page :manpage:`atof(2)` for details.
.. versionadded:: 2.4 .. versionadded:: 2.4
See the Unix man page :manpage:`atof(2)` for details. .. deprecated:: 3.1
Use :cfunc:`PyOS_string_to_double` instead.
.. cfunction:: char* PyOS_stricmp(char *s1, char *s2) .. cfunction:: char* PyOS_stricmp(char *s1, char *s2)
......
...@@ -1414,6 +1414,9 @@ Documentation ...@@ -1414,6 +1414,9 @@ Documentation
C-API C-API
----- -----
- Add new C-API function PyOS_string_to_double, and deprecated
PyOS_ascii_atof and PyOS_ascii_strtod.
- Removed _PyOS_double_to_string. Use PyOS_double_to_string - Removed _PyOS_double_to_string. Use PyOS_double_to_string
instead. This is in preparation for (but not strictly related to) instead. This is in preparation for (but not strictly related to)
issue #7117, short float repr. issue #7117, short float repr.
......
...@@ -270,6 +270,8 @@ _PyOS_ascii_strtod(const char *nptr, char **endptr) ...@@ -270,6 +270,8 @@ _PyOS_ascii_strtod(const char *nptr, char **endptr)
#endif #endif
/* PyOS_ascii_strtod is DEPRECATED in Python 2.7 and 3.1 */
double double
PyOS_ascii_strtod(const char *nptr, char **endptr) PyOS_ascii_strtod(const char *nptr, char **endptr)
{ {
...@@ -277,6 +279,12 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) ...@@ -277,6 +279,12 @@ PyOS_ascii_strtod(const char *nptr, char **endptr)
const char *p; const char *p;
double x; double x;
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"PyOS_ascii_strtod and PyOS_ascii_atof are "
"deprecated. Use PyOS_string_to_double "
"instead.", 1) < 0)
return -1.0;
/* _PyOS_ascii_strtod already does everything that we want, /* _PyOS_ascii_strtod already does everything that we want,
except that it doesn't parse leading whitespace */ except that it doesn't parse leading whitespace */
p = nptr; p = nptr;
...@@ -290,13 +298,15 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) ...@@ -290,13 +298,15 @@ PyOS_ascii_strtod(const char *nptr, char **endptr)
return x; return x;
} }
/* PyOS_ascii_strtod is DEPRECATED in Python 2.7 and 3.1 */
double double
PyOS_ascii_atof(const char *nptr) PyOS_ascii_atof(const char *nptr)
{ {
return PyOS_ascii_strtod(nptr, NULL); return PyOS_ascii_strtod(nptr, NULL);
} }
/* PyOS_string_to_double is the recommended replacement for the /* PyOS_string_to_double is the recommended replacement for the deprecated
PyOS_ascii_strtod and PyOS_ascii_atof functions. It converts a PyOS_ascii_strtod and PyOS_ascii_atof functions. It converts a
null-terminated byte string s (interpreted as a string of ASCII characters) null-terminated byte string s (interpreted as a string of ASCII characters)
to a float. The string should not have leading or trailing whitespace (in to a float. The string should not have leading or trailing whitespace (in
...@@ -332,7 +342,7 @@ PyOS_string_to_double(const char *s, ...@@ -332,7 +342,7 @@ PyOS_string_to_double(const char *s,
errno = 0; errno = 0;
PyFPE_START_PROTECT("PyOS_string_to_double", return -1.0) PyFPE_START_PROTECT("PyOS_string_to_double", return -1.0)
x = PyOS_ascii_strtod(s, &fail_pos); x = _PyOS_ascii_strtod(s, &fail_pos);
PyFPE_END_PROTECT(x) PyFPE_END_PROTECT(x)
if (errno == ENOMEM) { if (errno == ENOMEM) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment