| #define PY_SSIZE_T_CLEAN |
| |
| #include "parts.h" |
| |
| |
| // Test PyFloat_Pack2(), PyFloat_Pack4() and PyFloat_Pack8() |
| static PyObject * |
| test_float_pack(PyObject *self, PyObject *args) |
| { |
| int size; |
| double d; |
| int le; |
| if (!PyArg_ParseTuple(args, "idi", &size, &d, &le)) { |
| return NULL; |
| } |
| switch (size) |
| { |
| case 2: |
| { |
| char data[2]; |
| if (PyFloat_Pack2(d, data, le) < 0) { |
| return NULL; |
| } |
| return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data)); |
| } |
| case 4: |
| { |
| char data[4]; |
| if (PyFloat_Pack4(d, data, le) < 0) { |
| return NULL; |
| } |
| return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data)); |
| } |
| case 8: |
| { |
| char data[8]; |
| if (PyFloat_Pack8(d, data, le) < 0) { |
| return NULL; |
| } |
| return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data)); |
| } |
| default: break; |
| } |
| |
| PyErr_SetString(PyExc_ValueError, "size must 2, 4 or 8"); |
| return NULL; |
| } |
| |
| |
| // Test PyFloat_Unpack2(), PyFloat_Unpack4() and PyFloat_Unpack8() |
| static PyObject * |
| test_float_unpack(PyObject *self, PyObject *args) |
| { |
| assert(!PyErr_Occurred()); |
| const char *data; |
| Py_ssize_t size; |
| int le; |
| if (!PyArg_ParseTuple(args, "y#i", &data, &size, &le)) { |
| return NULL; |
| } |
| double d; |
| switch (size) |
| { |
| case 2: |
| d = PyFloat_Unpack2(data, le); |
| break; |
| case 4: |
| d = PyFloat_Unpack4(data, le); |
| break; |
| case 8: |
| d = PyFloat_Unpack8(data, le); |
| break; |
| default: |
| PyErr_SetString(PyExc_ValueError, "data length must 2, 4 or 8 bytes"); |
| return NULL; |
| } |
| |
| if (d == -1.0 && PyErr_Occurred()) { |
| return NULL; |
| } |
| return PyFloat_FromDouble(d); |
| } |
| |
| static PyMethodDef test_methods[] = { |
| {"float_pack", test_float_pack, METH_VARARGS, NULL}, |
| {"float_unpack", test_float_unpack, METH_VARARGS, NULL}, |
| {NULL}, |
| }; |
| |
| int |
| _PyTestCapi_Init_Float(PyObject *mod) |
| { |
| if (PyModule_AddFunctions(mod, test_methods) < 0) { |
| return -1; |
| } |
| |
| return 0; |
| } |