blob: 3a186e4c98f9efb20304daf62f246a25fa4c75b5 [file] [log] [blame]
Victor Stinner3f2d1012017-02-02 12:09:30 +01001/*[clinic input]
2preserve
3[clinic start generated code]*/
4
5PyDoc_STRVAR(Struct___init____doc__,
6"Struct(format)\n"
7"--\n"
8"\n"
9"Create a compiled struct object.\n"
10"\n"
11"Return a new Struct object which writes and reads binary data according to\n"
12"the format string.\n"
13"\n"
14"See help(struct) for more on format strings.");
15
16static int
17Struct___init___impl(PyStructObject *self, PyObject *format);
18
19static int
20Struct___init__(PyObject *self, PyObject *args, PyObject *kwargs)
21{
22 int return_value = -1;
23 static const char * const _keywords[] = {"format", NULL};
24 static _PyArg_Parser _parser = {"O:Struct", _keywords, 0};
25 PyObject *format;
26
27 if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
28 &format)) {
29 goto exit;
30 }
31 return_value = Struct___init___impl((PyStructObject *)self, format);
32
33exit:
34 return return_value;
35}
36
37PyDoc_STRVAR(Struct_unpack__doc__,
38"unpack($self, buffer, /)\n"
39"--\n"
40"\n"
41"Return a tuple containing unpacked values.\n"
42"\n"
43"Unpack according to the format string Struct.format. The buffer\'s size\n"
44"in bytes must be Struct.size.\n"
45"\n"
46"See help(struct) for more on format strings.");
47
48#define STRUCT_UNPACK_METHODDEF \
49 {"unpack", (PyCFunction)Struct_unpack, METH_O, Struct_unpack__doc__},
50
51static PyObject *
52Struct_unpack_impl(PyStructObject *self, Py_buffer *buffer);
53
54static PyObject *
55Struct_unpack(PyStructObject *self, PyObject *arg)
56{
57 PyObject *return_value = NULL;
58 Py_buffer buffer = {NULL, NULL};
59
Serhiy Storchaka32d96a22018-12-25 13:23:47 +020060 if (PyObject_GetBuffer(arg, &buffer, PyBUF_SIMPLE) != 0) {
61 goto exit;
62 }
63 if (!PyBuffer_IsContiguous(&buffer, 'C')) {
64 _PyArg_BadArgument("unpack", "contiguous buffer", arg);
Victor Stinner3f2d1012017-02-02 12:09:30 +010065 goto exit;
66 }
67 return_value = Struct_unpack_impl(self, &buffer);
68
69exit:
70 /* Cleanup for buffer */
71 if (buffer.obj) {
72 PyBuffer_Release(&buffer);
73 }
74
75 return return_value;
76}
77
78PyDoc_STRVAR(Struct_unpack_from__doc__,
79"unpack_from($self, /, buffer, offset=0)\n"
80"--\n"
81"\n"
82"Return a tuple containing unpacked values.\n"
83"\n"
84"Values are unpacked according to the format string Struct.format.\n"
85"\n"
Xiang Zhangc10b2882018-03-11 02:58:52 +080086"The buffer\'s size in bytes, starting at position offset, must be\n"
87"at least Struct.size.\n"
Victor Stinner3f2d1012017-02-02 12:09:30 +010088"\n"
89"See help(struct) for more on format strings.");
90
91#define STRUCT_UNPACK_FROM_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +020092 {"unpack_from", (PyCFunction)(void(*)(void))Struct_unpack_from, METH_FASTCALL|METH_KEYWORDS, Struct_unpack_from__doc__},
Victor Stinner3f2d1012017-02-02 12:09:30 +010093
94static PyObject *
95Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer,
96 Py_ssize_t offset);
97
98static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +020099Struct_unpack_from(PyStructObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Victor Stinner3f2d1012017-02-02 12:09:30 +0100100{
101 PyObject *return_value = NULL;
102 static const char * const _keywords[] = {"buffer", "offset", NULL};
103 static _PyArg_Parser _parser = {"y*|n:unpack_from", _keywords, 0};
104 Py_buffer buffer = {NULL, NULL};
105 Py_ssize_t offset = 0;
106
107 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
108 &buffer, &offset)) {
109 goto exit;
110 }
111 return_value = Struct_unpack_from_impl(self, &buffer, offset);
112
113exit:
114 /* Cleanup for buffer */
115 if (buffer.obj) {
116 PyBuffer_Release(&buffer);
117 }
118
119 return return_value;
120}
121
122PyDoc_STRVAR(Struct_iter_unpack__doc__,
123"iter_unpack($self, buffer, /)\n"
124"--\n"
125"\n"
126"Return an iterator yielding tuples.\n"
127"\n"
128"Tuples are unpacked from the given bytes source, like a repeated\n"
129"invocation of unpack_from().\n"
130"\n"
131"Requires that the bytes length be a multiple of the struct size.");
132
133#define STRUCT_ITER_UNPACK_METHODDEF \
134 {"iter_unpack", (PyCFunction)Struct_iter_unpack, METH_O, Struct_iter_unpack__doc__},
135
136PyDoc_STRVAR(_clearcache__doc__,
137"_clearcache($module, /)\n"
138"--\n"
139"\n"
140"Clear the internal cache.");
141
142#define _CLEARCACHE_METHODDEF \
143 {"_clearcache", (PyCFunction)_clearcache, METH_NOARGS, _clearcache__doc__},
144
145static PyObject *
146_clearcache_impl(PyObject *module);
147
148static PyObject *
149_clearcache(PyObject *module, PyObject *Py_UNUSED(ignored))
150{
151 return _clearcache_impl(module);
152}
153
154PyDoc_STRVAR(calcsize__doc__,
155"calcsize($module, format, /)\n"
156"--\n"
157"\n"
158"Return size in bytes of the struct described by the format string.");
159
160#define CALCSIZE_METHODDEF \
161 {"calcsize", (PyCFunction)calcsize, METH_O, calcsize__doc__},
162
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200163static Py_ssize_t
164calcsize_impl(PyObject *module, PyStructObject *s_object);
165
166static PyObject *
167calcsize(PyObject *module, PyObject *arg)
168{
169 PyObject *return_value = NULL;
170 PyStructObject *s_object = NULL;
171 Py_ssize_t _return_value;
172
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200173 if (!cache_struct_converter(arg, &s_object)) {
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200174 goto exit;
175 }
176 _return_value = calcsize_impl(module, s_object);
177 if ((_return_value == -1) && PyErr_Occurred()) {
178 goto exit;
179 }
180 return_value = PyLong_FromSsize_t(_return_value);
181
182exit:
183 /* Cleanup for s_object */
184 Py_XDECREF(s_object);
185
186 return return_value;
187}
188
Victor Stinner3f2d1012017-02-02 12:09:30 +0100189PyDoc_STRVAR(unpack__doc__,
Victor Stinnerc0f59ad2017-02-02 14:24:16 +0100190"unpack($module, format, buffer, /)\n"
Victor Stinner3f2d1012017-02-02 12:09:30 +0100191"--\n"
192"\n"
193"Return a tuple containing values unpacked according to the format string.\n"
194"\n"
195"The buffer\'s size in bytes must be calcsize(format).\n"
196"\n"
197"See help(struct) for more on format strings.");
198
199#define UNPACK_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200200 {"unpack", (PyCFunction)(void(*)(void))unpack, METH_FASTCALL, unpack__doc__},
Victor Stinner3f2d1012017-02-02 12:09:30 +0100201
202static PyObject *
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200203unpack_impl(PyObject *module, PyStructObject *s_object, Py_buffer *buffer);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100204
205static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200206unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Victor Stinner3f2d1012017-02-02 12:09:30 +0100207{
208 PyObject *return_value = NULL;
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200209 PyStructObject *s_object = NULL;
Victor Stinnerc0f59ad2017-02-02 14:24:16 +0100210 Py_buffer buffer = {NULL, NULL};
Victor Stinner3f2d1012017-02-02 12:09:30 +0100211
Sylvain74453812017-06-10 06:51:48 +0200212 if (!_PyArg_ParseStack(args, nargs, "O&y*:unpack",
213 cache_struct_converter, &s_object, &buffer)) {
Victor Stinner3f2d1012017-02-02 12:09:30 +0100214 goto exit;
215 }
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200216 return_value = unpack_impl(module, s_object, &buffer);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100217
218exit:
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200219 /* Cleanup for s_object */
220 Py_XDECREF(s_object);
Victor Stinnerc0f59ad2017-02-02 14:24:16 +0100221 /* Cleanup for buffer */
222 if (buffer.obj) {
223 PyBuffer_Release(&buffer);
224 }
225
Victor Stinner3f2d1012017-02-02 12:09:30 +0100226 return return_value;
227}
228
229PyDoc_STRVAR(unpack_from__doc__,
230"unpack_from($module, format, /, buffer, offset=0)\n"
231"--\n"
232"\n"
233"Return a tuple containing values unpacked according to the format string.\n"
234"\n"
235"The buffer\'s size, minus offset, must be at least calcsize(format).\n"
236"\n"
237"See help(struct) for more on format strings.");
238
239#define UNPACK_FROM_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200240 {"unpack_from", (PyCFunction)(void(*)(void))unpack_from, METH_FASTCALL|METH_KEYWORDS, unpack_from__doc__},
Victor Stinner3f2d1012017-02-02 12:09:30 +0100241
242static PyObject *
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200243unpack_from_impl(PyObject *module, PyStructObject *s_object,
244 Py_buffer *buffer, Py_ssize_t offset);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100245
246static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200247unpack_from(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Victor Stinner3f2d1012017-02-02 12:09:30 +0100248{
249 PyObject *return_value = NULL;
250 static const char * const _keywords[] = {"", "buffer", "offset", NULL};
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200251 static _PyArg_Parser _parser = {"O&y*|n:unpack_from", _keywords, 0};
252 PyStructObject *s_object = NULL;
Victor Stinner3f2d1012017-02-02 12:09:30 +0100253 Py_buffer buffer = {NULL, NULL};
254 Py_ssize_t offset = 0;
255
256 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200257 cache_struct_converter, &s_object, &buffer, &offset)) {
Victor Stinner3f2d1012017-02-02 12:09:30 +0100258 goto exit;
259 }
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200260 return_value = unpack_from_impl(module, s_object, &buffer, offset);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100261
262exit:
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200263 /* Cleanup for s_object */
264 Py_XDECREF(s_object);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100265 /* Cleanup for buffer */
266 if (buffer.obj) {
267 PyBuffer_Release(&buffer);
268 }
269
270 return return_value;
271}
272
273PyDoc_STRVAR(iter_unpack__doc__,
274"iter_unpack($module, format, buffer, /)\n"
275"--\n"
276"\n"
277"Return an iterator yielding tuples unpacked from the given bytes.\n"
278"\n"
279"The bytes are unpacked according to the format string, like\n"
280"a repeated invocation of unpack_from().\n"
281"\n"
282"Requires that the bytes length be a multiple of the format struct size.");
283
284#define ITER_UNPACK_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200285 {"iter_unpack", (PyCFunction)(void(*)(void))iter_unpack, METH_FASTCALL, iter_unpack__doc__},
Victor Stinner3f2d1012017-02-02 12:09:30 +0100286
287static PyObject *
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200288iter_unpack_impl(PyObject *module, PyStructObject *s_object,
289 PyObject *buffer);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100290
291static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200292iter_unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Victor Stinner3f2d1012017-02-02 12:09:30 +0100293{
294 PyObject *return_value = NULL;
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200295 PyStructObject *s_object = NULL;
Victor Stinner3f2d1012017-02-02 12:09:30 +0100296 PyObject *buffer;
297
Sylvain74453812017-06-10 06:51:48 +0200298 if (!_PyArg_ParseStack(args, nargs, "O&O:iter_unpack",
299 cache_struct_converter, &s_object, &buffer)) {
Victor Stinner3f2d1012017-02-02 12:09:30 +0100300 goto exit;
301 }
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200302 return_value = iter_unpack_impl(module, s_object, buffer);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100303
304exit:
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200305 /* Cleanup for s_object */
306 Py_XDECREF(s_object);
307
Victor Stinner3f2d1012017-02-02 12:09:30 +0100308 return return_value;
309}
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200310/*[clinic end generated code: output=01516bea2641fe01 input=a9049054013a1b77]*/