1 // clinic/float.c.h uses internal pycore_modsupport.h API
2 #define PYTESTCAPI_NEED_INTERNAL_API
3
4 #include "parts.h"
5 #include "util.h"
6 #include "clinic/float.c.h"
7
8
9 /*[clinic input]
10 module _testcapi
11 [clinic start generated code]*/
12 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=6361033e795369fc]*/
13
14 /*[clinic input]
15 _testcapi.float_pack
16
17 size: int
18 d: double
19 le: int
20 /
21
22 Test PyFloat_Pack2(), PyFloat_Pack4() and PyFloat_Pack8()
23 [clinic start generated code]*/
24
25 static PyObject *
_testcapi_float_pack_impl(PyObject * module,int size,double d,int le)26 _testcapi_float_pack_impl(PyObject *module, int size, double d, int le)
27 /*[clinic end generated code: output=7899bd98f8b6cb04 input=52c9115121999c98]*/
28 {
29 switch (size)
30 {
31 case 2:
32 {
33 char data[2];
34 if (PyFloat_Pack2(d, data, le) < 0) {
35 return NULL;
36 }
37 return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
38 }
39 case 4:
40 {
41 char data[4];
42 if (PyFloat_Pack4(d, data, le) < 0) {
43 return NULL;
44 }
45 return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
46 }
47 case 8:
48 {
49 char data[8];
50 if (PyFloat_Pack8(d, data, le) < 0) {
51 return NULL;
52 }
53 return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
54 }
55 default: break;
56 }
57
58 PyErr_SetString(PyExc_ValueError, "size must 2, 4 or 8");
59 return NULL;
60 }
61
62
63 /*[clinic input]
64 _testcapi.float_unpack
65
66 data: str(accept={robuffer}, zeroes=True)
67 le: int
68 /
69
70 Test PyFloat_Unpack2(), PyFloat_Unpack4() and PyFloat_Unpack8()
71 [clinic start generated code]*/
72
73 static PyObject *
_testcapi_float_unpack_impl(PyObject * module,const char * data,Py_ssize_t data_length,int le)74 _testcapi_float_unpack_impl(PyObject *module, const char *data,
75 Py_ssize_t data_length, int le)
76 /*[clinic end generated code: output=617059f889ddbfe4 input=c095e4bb75a696cd]*/
77 {
78 assert(!PyErr_Occurred());
79 double d;
80 switch (data_length)
81 {
82 case 2:
83 d = PyFloat_Unpack2(data, le);
84 break;
85 case 4:
86 d = PyFloat_Unpack4(data, le);
87 break;
88 case 8:
89 d = PyFloat_Unpack8(data, le);
90 break;
91 default:
92 PyErr_SetString(PyExc_ValueError, "data length must 2, 4 or 8 bytes");
93 return NULL;
94 }
95
96 if (d == -1.0 && PyErr_Occurred()) {
97 return NULL;
98 }
99 return PyFloat_FromDouble(d);
100 }
101
102 static PyMethodDef test_methods[] = {
103 _TESTCAPI_FLOAT_PACK_METHODDEF
104 _TESTCAPI_FLOAT_UNPACK_METHODDEF
105 {NULL},
106 };
107
108 int
_PyTestCapi_Init_Float(PyObject * mod)109 _PyTestCapi_Init_Float(PyObject *mod)
110 {
111 if (PyModule_AddFunctions(mod, test_methods) < 0) {
112 return -1;
113 }
114
115 return 0;
116 }
117