Issue #5988: Delete deprecated functions PyOS_ascii_formatd, PyOS_ascii_strtod, and PyOS_ascii_atof.
This commit is contained in:
parent
9d2d327963
commit
68af50ba39
|
@ -51,21 +51,6 @@ 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_ascii_strtod(const char *nptr, char **endptr)
|
|
||||||
|
|
||||||
Convert a string to a :ctype:`double`. This function behaves like the Standard C
|
|
||||||
function :cfunc:`strtod` does in the C locale. It does this without changing the
|
|
||||||
current locale, since that would not be thread-safe.
|
|
||||||
|
|
||||||
:cfunc:`PyOS_ascii_strtod` should typically be used for reading configuration
|
|
||||||
files or other non-user input that should be locale independent.
|
|
||||||
|
|
||||||
See the Unix man page :manpage:`strtod(2)` for details.
|
|
||||||
|
|
||||||
.. deprecated:: 3.1
|
|
||||||
Use :cfunc:`PyOS_string_to_double` instead.
|
|
||||||
|
|
||||||
|
|
||||||
.. cfunction:: double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)
|
.. 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
|
Convert a string ``s`` to a :ctype:`double`, raising a Python
|
||||||
|
@ -100,20 +85,6 @@ The following functions provide locale-independent string to number conversions.
|
||||||
.. versionadded:: 3.1
|
.. versionadded:: 3.1
|
||||||
|
|
||||||
|
|
||||||
.. cfunction:: char* PyOS_ascii_formatd(char *buffer, size_t buf_len, const char *format, double d)
|
|
||||||
|
|
||||||
Convert a :ctype:`double` to a string using the ``'.'`` as the decimal
|
|
||||||
separator. *format* is a :cfunc:`printf`\ -style format string specifying the
|
|
||||||
number format. Allowed conversion characters are ``'e'``, ``'E'``, ``'f'``,
|
|
||||||
``'F'``, ``'g'`` and ``'G'``.
|
|
||||||
|
|
||||||
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)
|
.. 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
|
Convert a :ctype:`double` *val* to a string using supplied
|
||||||
|
@ -148,16 +119,6 @@ The following functions provide locale-independent string to number conversions.
|
||||||
.. versionadded:: 3.1
|
.. versionadded:: 3.1
|
||||||
|
|
||||||
|
|
||||||
.. cfunction:: double PyOS_ascii_atof(const char *nptr)
|
|
||||||
|
|
||||||
Convert a string to a :ctype:`double` in a locale-independent way.
|
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
Case insensitive comparison of strings. The function works almost
|
Case insensitive comparison of strings. The function works almost
|
||||||
|
|
|
@ -6,9 +6,6 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
PyAPI_FUNC(double) PyOS_ascii_strtod(const char *str, char **ptr);
|
|
||||||
PyAPI_FUNC(double) PyOS_ascii_atof(const char *str);
|
|
||||||
PyAPI_FUNC(char *) PyOS_ascii_formatd(char *buffer, size_t buf_len, const char *format, double d);
|
|
||||||
PyAPI_FUNC(double) PyOS_string_to_double(const char *str,
|
PyAPI_FUNC(double) PyOS_string_to_double(const char *str,
|
||||||
char **endptr,
|
char **endptr,
|
||||||
PyObject *overflow_exception);
|
PyObject *overflow_exception);
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
# PyOS_ascii_formatd is deprecated and not called from anywhere in
|
|
||||||
# Python itself. So this module is the only place it gets tested.
|
|
||||||
# Test that it works, and test that it's deprecated.
|
|
||||||
|
|
||||||
import unittest
|
|
||||||
from test.support import check_warnings, run_unittest, cpython_only
|
|
||||||
|
|
||||||
class FormatDeprecationTests(unittest.TestCase):
|
|
||||||
|
|
||||||
@cpython_only
|
|
||||||
def testFormatDeprecation(self):
|
|
||||||
# delay importing ctypes until we know we're in CPython
|
|
||||||
from ctypes import (pythonapi, create_string_buffer, sizeof, byref,
|
|
||||||
c_double)
|
|
||||||
PyOS_ascii_formatd = pythonapi.PyOS_ascii_formatd
|
|
||||||
buf = create_string_buffer(100)
|
|
||||||
|
|
||||||
with check_warnings() as w:
|
|
||||||
PyOS_ascii_formatd(byref(buf), sizeof(buf), b'%+.10f',
|
|
||||||
c_double(10.0))
|
|
||||||
self.assertEqual(buf.value, b'+10.0000000000')
|
|
||||||
|
|
||||||
self.assertEqual(w.category, DeprecationWarning)
|
|
||||||
|
|
||||||
class FormatTests(unittest.TestCase):
|
|
||||||
# ensure that, for the restricted set of format codes,
|
|
||||||
# %-formatting returns the same values os PyOS_ascii_formatd
|
|
||||||
@cpython_only
|
|
||||||
def testFormat(self):
|
|
||||||
# delay importing ctypes until we know we're in CPython
|
|
||||||
from ctypes import (pythonapi, create_string_buffer, sizeof, byref,
|
|
||||||
c_double)
|
|
||||||
PyOS_ascii_formatd = pythonapi.PyOS_ascii_formatd
|
|
||||||
buf = create_string_buffer(100)
|
|
||||||
|
|
||||||
tests = [
|
|
||||||
('%f', 100.0),
|
|
||||||
('%g', 100.0),
|
|
||||||
('%#g', 100.0),
|
|
||||||
('%#.2g', 100.0),
|
|
||||||
('%#.2g', 123.4567),
|
|
||||||
('%#.2g', 1.234567e200),
|
|
||||||
('%e', 1.234567e200),
|
|
||||||
('%e', 1.234),
|
|
||||||
('%+e', 1.234),
|
|
||||||
('%-e', 1.234),
|
|
||||||
]
|
|
||||||
|
|
||||||
with check_warnings():
|
|
||||||
for format, val in tests:
|
|
||||||
PyOS_ascii_formatd(byref(buf), sizeof(buf),
|
|
||||||
bytes(format, 'ascii'),
|
|
||||||
c_double(val))
|
|
||||||
self.assertEqual(buf.value, bytes(format % val, 'ascii'))
|
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
|
||||||
run_unittest(FormatDeprecationTests, FormatTests)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
test_main()
|
|
|
@ -12,6 +12,11 @@ What's New in Python 3.2 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #5988: Remove deprecated functions PyOS_ascii_formatd,
|
||||||
|
PyOS_ascii_strtod, and PyOS_ascii_atof. Use PyOS_double_to_string
|
||||||
|
and PyOS_string_to_double instead. See issue #5835 for the original
|
||||||
|
deprecations.
|
||||||
|
|
||||||
- Issue #7385: Fix a crash in `MemoryView_FromObject` when
|
- Issue #7385: Fix a crash in `MemoryView_FromObject` when
|
||||||
`PyObject_GetBuffer` fails. Patch by Florent Xicluna.
|
`PyObject_GetBuffer` fails. Patch by Florent Xicluna.
|
||||||
|
|
||||||
|
|
|
@ -1048,11 +1048,6 @@ EXPORTS
|
||||||
"_PyThreadState_Current"
|
"_PyThreadState_Current"
|
||||||
"_PyThreadState_GetFrame"
|
"_PyThreadState_GetFrame"
|
||||||
|
|
||||||
; From python26_s.lib(pystrtod)
|
|
||||||
"PyOS_ascii_strtod"
|
|
||||||
"PyOS_ascii_formatd"
|
|
||||||
"PyOS_ascii_atof"
|
|
||||||
|
|
||||||
; From python26_s.lib(pythonrun)
|
; From python26_s.lib(pythonrun)
|
||||||
"Py_IgnoreEnvironmentFlag"
|
"Py_IgnoreEnvironmentFlag"
|
||||||
"Py_DebugFlag"
|
"Py_DebugFlag"
|
||||||
|
|
|
@ -58,7 +58,7 @@ _Py_parse_inf_or_nan(const char *p, char **endptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PyOS_ascii_strtod:
|
* _PyOS_ascii_strtod:
|
||||||
* @nptr: the string to convert to a numeric value.
|
* @nptr: the string to convert to a numeric value.
|
||||||
* @endptr: if non-%NULL, it returns the character after
|
* @endptr: if non-%NULL, it returns the character after
|
||||||
* the last character used in the conversion.
|
* the last character used in the conversion.
|
||||||
|
@ -88,7 +88,7 @@ _Py_parse_inf_or_nan(const char *p, char **endptr)
|
||||||
|
|
||||||
#ifndef PY_NO_SHORT_FLOAT_REPR
|
#ifndef PY_NO_SHORT_FLOAT_REPR
|
||||||
|
|
||||||
double
|
static double
|
||||||
_PyOS_ascii_strtod(const char *nptr, char **endptr)
|
_PyOS_ascii_strtod(const char *nptr, char **endptr)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
|
@ -121,7 +121,7 @@ _PyOS_ascii_strtod(const char *nptr, char **endptr)
|
||||||
correctly rounded results.
|
correctly rounded results.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
double
|
static double
|
||||||
_PyOS_ascii_strtod(const char *nptr, char **endptr)
|
_PyOS_ascii_strtod(const char *nptr, char **endptr)
|
||||||
{
|
{
|
||||||
char *fail_pos;
|
char *fail_pos;
|
||||||
|
@ -270,48 +270,10 @@ _PyOS_ascii_strtod(const char *nptr, char **endptr)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* PyOS_ascii_strtod is DEPRECATED in Python 3.1 */
|
/* PyOS_string_to_double converts a null-terminated byte string s (interpreted
|
||||||
|
as a string of ASCII characters) to a float. The string should not have
|
||||||
double
|
leading or trailing whitespace. The conversion is independent of the
|
||||||
PyOS_ascii_strtod(const char *nptr, char **endptr)
|
current locale.
|
||||||
{
|
|
||||||
char *fail_pos;
|
|
||||||
const char *p;
|
|
||||||
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,
|
|
||||||
except that it doesn't parse leading whitespace */
|
|
||||||
p = nptr;
|
|
||||||
while (Py_ISSPACE(*p))
|
|
||||||
p++;
|
|
||||||
x = _PyOS_ascii_strtod(p, &fail_pos);
|
|
||||||
if (fail_pos == p)
|
|
||||||
fail_pos = (char *)nptr;
|
|
||||||
if (endptr)
|
|
||||||
*endptr = (char *)fail_pos;
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PyOS_ascii_strtod is DEPRECATED in Python 3.1 */
|
|
||||||
|
|
||||||
double
|
|
||||||
PyOS_ascii_atof(const char *nptr)
|
|
||||||
{
|
|
||||||
return PyOS_ascii_strtod(nptr, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PyOS_string_to_double is the recommended replacement for the deprecated
|
|
||||||
PyOS_ascii_strtod and PyOS_ascii_atof functions. It converts a
|
|
||||||
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
|
|
||||||
contrast, PyOS_ascii_strtod allows leading whitespace but not trailing
|
|
||||||
whitespace). The conversion is independent of the current locale.
|
|
||||||
|
|
||||||
If endptr is NULL, try to convert the whole string. Raise ValueError and
|
If endptr is NULL, try to convert the whole string. Raise ValueError and
|
||||||
return -1.0 if the string is not a valid representation of a floating-point
|
return -1.0 if the string is not a valid representation of a floating-point
|
||||||
|
@ -369,6 +331,8 @@ PyOS_string_to_double(const char *s,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PY_NO_SHORT_FLOAT_REPR
|
||||||
|
|
||||||
/* Given a string that may have a decimal point in the current
|
/* Given a string that may have a decimal point in the current
|
||||||
locale, change it back to a dot. Since the string cannot get
|
locale, change it back to a dot. Since the string cannot get
|
||||||
longer, no need for a maximum buffer size parameter. */
|
longer, no need for a maximum buffer size parameter. */
|
||||||
|
@ -618,12 +582,13 @@ ensure_decimal_point(char* buffer, size_t buf_size, int precision)
|
||||||
#define FLOAT_FORMATBUFLEN 120
|
#define FLOAT_FORMATBUFLEN 120
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PyOS_ascii_formatd:
|
* _PyOS_ascii_formatd:
|
||||||
* @buffer: A buffer to place the resulting string in
|
* @buffer: A buffer to place the resulting string in
|
||||||
* @buf_size: The length of the buffer.
|
* @buf_size: The length of the buffer.
|
||||||
* @format: The printf()-style format to use for the
|
* @format: The printf()-style format to use for the
|
||||||
* code to use for converting.
|
* code to use for converting.
|
||||||
* @d: The #gdouble to convert
|
* @d: The #gdouble to convert
|
||||||
|
* @precision: The precision to use when formatting.
|
||||||
*
|
*
|
||||||
* Converts a #gdouble to a string, using the '.' as
|
* Converts a #gdouble to a string, using the '.' as
|
||||||
* decimal point. To format the number you pass in
|
* decimal point. To format the number you pass in
|
||||||
|
@ -636,7 +601,7 @@ ensure_decimal_point(char* buffer, size_t buf_size, int precision)
|
||||||
* Return value: The pointer to the buffer with the converted string.
|
* Return value: The pointer to the buffer with the converted string.
|
||||||
* On failure returns NULL but does not set any Python exception.
|
* On failure returns NULL but does not set any Python exception.
|
||||||
**/
|
**/
|
||||||
char *
|
static char *
|
||||||
_PyOS_ascii_formatd(char *buffer,
|
_PyOS_ascii_formatd(char *buffer,
|
||||||
size_t buf_size,
|
size_t buf_size,
|
||||||
const char *format,
|
const char *format,
|
||||||
|
@ -716,22 +681,6 @@ _PyOS_ascii_formatd(char *buffer,
|
||||||
return 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, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PY_NO_SHORT_FLOAT_REPR
|
|
||||||
|
|
||||||
/* The fallback code to use if _Py_dg_dtoa is not available. */
|
/* The fallback code to use if _Py_dg_dtoa is not available. */
|
||||||
|
|
||||||
PyAPI_FUNC(char *) PyOS_double_to_string(double val,
|
PyAPI_FUNC(char *) PyOS_double_to_string(double val,
|
||||||
|
|
Loading…
Reference in New Issue