blob: 2cc2d216f8b4b3eceef038b940564308fe7a0c2f [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')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +020064 _PyArg_BadArgument("unpack", 0, "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
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200212 if (!_PyArg_CheckPositional("unpack", nargs, 2, 2)) {
213 goto exit;
214 }
215 if (!cache_struct_converter(args[0], &s_object)) {
216 goto exit;
217 }
218 if (PyObject_GetBuffer(args[1], &buffer, PyBUF_SIMPLE) != 0) {
219 goto exit;
220 }
221 if (!PyBuffer_IsContiguous(&buffer, 'C')) {
222 _PyArg_BadArgument("unpack", 2, "contiguous buffer", args[1]);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100223 goto exit;
224 }
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200225 return_value = unpack_impl(module, s_object, &buffer);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100226
227exit:
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200228 /* Cleanup for s_object */
229 Py_XDECREF(s_object);
Victor Stinnerc0f59ad2017-02-02 14:24:16 +0100230 /* Cleanup for buffer */
231 if (buffer.obj) {
232 PyBuffer_Release(&buffer);
233 }
234
Victor Stinner3f2d1012017-02-02 12:09:30 +0100235 return return_value;
236}
237
238PyDoc_STRVAR(unpack_from__doc__,
239"unpack_from($module, format, /, buffer, offset=0)\n"
240"--\n"
241"\n"
242"Return a tuple containing values unpacked according to the format string.\n"
243"\n"
244"The buffer\'s size, minus offset, must be at least calcsize(format).\n"
245"\n"
246"See help(struct) for more on format strings.");
247
248#define UNPACK_FROM_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200249 {"unpack_from", (PyCFunction)(void(*)(void))unpack_from, METH_FASTCALL|METH_KEYWORDS, unpack_from__doc__},
Victor Stinner3f2d1012017-02-02 12:09:30 +0100250
251static PyObject *
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200252unpack_from_impl(PyObject *module, PyStructObject *s_object,
253 Py_buffer *buffer, Py_ssize_t offset);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100254
255static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200256unpack_from(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Victor Stinner3f2d1012017-02-02 12:09:30 +0100257{
258 PyObject *return_value = NULL;
259 static const char * const _keywords[] = {"", "buffer", "offset", NULL};
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200260 static _PyArg_Parser _parser = {"O&y*|n:unpack_from", _keywords, 0};
261 PyStructObject *s_object = NULL;
Victor Stinner3f2d1012017-02-02 12:09:30 +0100262 Py_buffer buffer = {NULL, NULL};
263 Py_ssize_t offset = 0;
264
265 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200266 cache_struct_converter, &s_object, &buffer, &offset)) {
Victor Stinner3f2d1012017-02-02 12:09:30 +0100267 goto exit;
268 }
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200269 return_value = unpack_from_impl(module, s_object, &buffer, offset);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100270
271exit:
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200272 /* Cleanup for s_object */
273 Py_XDECREF(s_object);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100274 /* Cleanup for buffer */
275 if (buffer.obj) {
276 PyBuffer_Release(&buffer);
277 }
278
279 return return_value;
280}
281
282PyDoc_STRVAR(iter_unpack__doc__,
283"iter_unpack($module, format, buffer, /)\n"
284"--\n"
285"\n"
286"Return an iterator yielding tuples unpacked from the given bytes.\n"
287"\n"
288"The bytes are unpacked according to the format string, like\n"
289"a repeated invocation of unpack_from().\n"
290"\n"
291"Requires that the bytes length be a multiple of the format struct size.");
292
293#define ITER_UNPACK_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200294 {"iter_unpack", (PyCFunction)(void(*)(void))iter_unpack, METH_FASTCALL, iter_unpack__doc__},
Victor Stinner3f2d1012017-02-02 12:09:30 +0100295
296static PyObject *
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200297iter_unpack_impl(PyObject *module, PyStructObject *s_object,
298 PyObject *buffer);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100299
300static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200301iter_unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Victor Stinner3f2d1012017-02-02 12:09:30 +0100302{
303 PyObject *return_value = NULL;
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200304 PyStructObject *s_object = NULL;
Victor Stinner3f2d1012017-02-02 12:09:30 +0100305 PyObject *buffer;
306
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200307 if (!_PyArg_CheckPositional("iter_unpack", nargs, 2, 2)) {
Victor Stinner3f2d1012017-02-02 12:09:30 +0100308 goto exit;
309 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200310 if (!cache_struct_converter(args[0], &s_object)) {
311 goto exit;
312 }
313 buffer = args[1];
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200314 return_value = iter_unpack_impl(module, s_object, buffer);
Victor Stinner3f2d1012017-02-02 12:09:30 +0100315
316exit:
Serhiy Storchakaa5a55902017-02-04 11:14:52 +0200317 /* Cleanup for s_object */
318 Py_XDECREF(s_object);
319
Victor Stinner3f2d1012017-02-02 12:09:30 +0100320 return return_value;
321}
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200322/*[clinic end generated code: output=ac595db9d2b271aa input=a9049054013a1b77]*/