blob: bd4de8d02a679a2aa0442d1dd27a23975e1e4fce [file] [log] [blame]
Benjamin Peterson4ae19462008-07-31 15:03:40 +00001/* struct module -- pack values into and (out of) bytes objects */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002
3/* New version supporting byte order, alignment and size options,
4 character strings, and unsigned numbers */
5
6#define PY_SSIZE_T_CLEAN
7
8#include "Python.h"
Thomas Wouters477c8d52006-05-27 19:21:47 +00009#include "structmember.h"
10#include <ctype.h>
11
Victor Stinner3f2d1012017-02-02 12:09:30 +010012/*[clinic input]
13class Struct "PyStructObject *" "&PyStructType"
14[clinic start generated code]*/
15/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9b032058a83ed7c3]*/
16
Thomas Wouters477c8d52006-05-27 19:21:47 +000017static PyTypeObject PyStructType;
18
Thomas Wouters477c8d52006-05-27 19:21:47 +000019/* The translation function for each format character is table driven */
20typedef struct _formatdef {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000021 char format;
22 Py_ssize_t size;
23 Py_ssize_t alignment;
24 PyObject* (*unpack)(const char *,
25 const struct _formatdef *);
26 int (*pack)(char *, PyObject *,
27 const struct _formatdef *);
Thomas Wouters477c8d52006-05-27 19:21:47 +000028} formatdef;
29
30typedef struct _formatcode {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000031 const struct _formatdef *fmtdef;
32 Py_ssize_t offset;
33 Py_ssize_t size;
Serhiy Storchakafff61f22013-05-17 10:49:44 +030034 Py_ssize_t repeat;
Thomas Wouters477c8d52006-05-27 19:21:47 +000035} formatcode;
36
37/* Struct object interface */
38
39typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 PyObject_HEAD
41 Py_ssize_t s_size;
42 Py_ssize_t s_len;
43 formatcode *s_codes;
44 PyObject *s_format;
45 PyObject *weakreflist; /* List of weak references */
Thomas Wouters477c8d52006-05-27 19:21:47 +000046} PyStructObject;
47
48
49#define PyStruct_Check(op) PyObject_TypeCheck(op, &PyStructType)
Christian Heimes90aa7642007-12-19 02:45:37 +000050#define PyStruct_CheckExact(op) (Py_TYPE(op) == &PyStructType)
Thomas Wouters477c8d52006-05-27 19:21:47 +000051
52
53/* Exception */
54
55static PyObject *StructError;
56
57
58/* Define various structs to figure out the alignments of types */
59
60
61typedef struct { char c; short x; } st_short;
62typedef struct { char c; int x; } st_int;
63typedef struct { char c; long x; } st_long;
64typedef struct { char c; float x; } st_float;
65typedef struct { char c; double x; } st_double;
66typedef struct { char c; void *x; } st_void_p;
Antoine Pitrou45d9c912011-10-06 15:27:40 +020067typedef struct { char c; size_t x; } st_size_t;
Benjamin Petersona9296e72016-09-07 11:06:17 -070068typedef struct { char c; _Bool x; } st_bool;
Thomas Wouters477c8d52006-05-27 19:21:47 +000069
70#define SHORT_ALIGN (sizeof(st_short) - sizeof(short))
71#define INT_ALIGN (sizeof(st_int) - sizeof(int))
72#define LONG_ALIGN (sizeof(st_long) - sizeof(long))
73#define FLOAT_ALIGN (sizeof(st_float) - sizeof(float))
74#define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double))
75#define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *))
Antoine Pitrou45d9c912011-10-06 15:27:40 +020076#define SIZE_T_ALIGN (sizeof(st_size_t) - sizeof(size_t))
Benjamin Petersona9296e72016-09-07 11:06:17 -070077#define BOOL_ALIGN (sizeof(st_bool) - sizeof(_Bool))
Thomas Wouters477c8d52006-05-27 19:21:47 +000078
79/* We can't support q and Q in native mode unless the compiler does;
80 in std mode, they're 8 bytes on all platforms. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -070081typedef struct { char c; long long x; } s_long_long;
82#define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(long long))
Thomas Wouters477c8d52006-05-27 19:21:47 +000083
Thomas Wouters477c8d52006-05-27 19:21:47 +000084#ifdef __powerc
85#pragma options align=reset
86#endif
87
Serhiy Storchakaa5a55902017-02-04 11:14:52 +020088/*[python input]
89class cache_struct_converter(CConverter):
90 type = 'PyStructObject *'
91 converter = 'cache_struct_converter'
92 c_default = "NULL"
93
94 def cleanup(self):
95 return "Py_XDECREF(%s);\n" % self.name
96[python start generated code]*/
97/*[python end generated code: output=da39a3ee5e6b4b0d input=49957cca130ffb63]*/
98
99static int cache_struct_converter(PyObject *, PyObject **);
100
Victor Stinner3f2d1012017-02-02 12:09:30 +0100101#include "clinic/_struct.c.h"
102
Mark Dickinson055a3fb2010-04-03 15:26:31 +0000103/* Helper for integer format codes: converts an arbitrary Python object to a
104 PyLongObject if possible, otherwise fails. Caller should decref. */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000105
106static PyObject *
107get_pylong(PyObject *v)
108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 assert(v != NULL);
110 if (!PyLong_Check(v)) {
111 /* Not an integer; try to use __index__ to convert. */
112 if (PyIndex_Check(v)) {
113 v = PyNumber_Index(v);
114 if (v == NULL)
115 return NULL;
116 }
117 else {
118 PyErr_SetString(StructError,
119 "required argument is not an integer");
120 return NULL;
121 }
122 }
123 else
124 Py_INCREF(v);
Mark Dickinsonea835e72009-04-19 20:40:33 +0000125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 assert(PyLong_Check(v));
127 return v;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000128}
129
Mark Dickinsonea835e72009-04-19 20:40:33 +0000130/* Helper routine to get a C long and raise the appropriate error if it isn't
131 one */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132
133static int
134get_long(PyObject *v, long *p)
135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 long x;
Mark Dickinsonea835e72009-04-19 20:40:33 +0000137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 v = get_pylong(v);
139 if (v == NULL)
140 return -1;
141 assert(PyLong_Check(v));
142 x = PyLong_AsLong(v);
143 Py_DECREF(v);
144 if (x == (long)-1 && PyErr_Occurred()) {
145 if (PyErr_ExceptionMatches(PyExc_OverflowError))
146 PyErr_SetString(StructError,
147 "argument out of range");
148 return -1;
149 }
150 *p = x;
151 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000152}
153
154
155/* Same, but handling unsigned long */
156
157static int
158get_ulong(PyObject *v, unsigned long *p)
159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 unsigned long x;
Mark Dickinsonea835e72009-04-19 20:40:33 +0000161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 v = get_pylong(v);
163 if (v == NULL)
164 return -1;
165 assert(PyLong_Check(v));
166 x = PyLong_AsUnsignedLong(v);
167 Py_DECREF(v);
168 if (x == (unsigned long)-1 && PyErr_Occurred()) {
169 if (PyErr_ExceptionMatches(PyExc_OverflowError))
170 PyErr_SetString(StructError,
171 "argument out of range");
172 return -1;
173 }
174 *p = x;
175 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000176}
177
Thomas Wouters477c8d52006-05-27 19:21:47 +0000178/* Same, but handling native long long. */
179
180static int
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700181get_longlong(PyObject *v, long long *p)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000182{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700183 long long x;
Mark Dickinson055a3fb2010-04-03 15:26:31 +0000184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 v = get_pylong(v);
186 if (v == NULL)
187 return -1;
188 assert(PyLong_Check(v));
189 x = PyLong_AsLongLong(v);
190 Py_DECREF(v);
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700191 if (x == (long long)-1 && PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 if (PyErr_ExceptionMatches(PyExc_OverflowError))
193 PyErr_SetString(StructError,
194 "argument out of range");
195 return -1;
196 }
197 *p = x;
198 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000199}
200
201/* Same, but handling native unsigned long long. */
202
203static int
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700204get_ulonglong(PyObject *v, unsigned long long *p)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000205{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700206 unsigned long long x;
Mark Dickinson055a3fb2010-04-03 15:26:31 +0000207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 v = get_pylong(v);
209 if (v == NULL)
210 return -1;
211 assert(PyLong_Check(v));
212 x = PyLong_AsUnsignedLongLong(v);
213 Py_DECREF(v);
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700214 if (x == (unsigned long long)-1 && PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 if (PyErr_ExceptionMatches(PyExc_OverflowError))
216 PyErr_SetString(StructError,
217 "argument out of range");
218 return -1;
219 }
220 *p = x;
221 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000222}
223
Antoine Pitrou45d9c912011-10-06 15:27:40 +0200224/* Same, but handling Py_ssize_t */
225
226static int
227get_ssize_t(PyObject *v, Py_ssize_t *p)
228{
229 Py_ssize_t x;
230
231 v = get_pylong(v);
232 if (v == NULL)
233 return -1;
234 assert(PyLong_Check(v));
235 x = PyLong_AsSsize_t(v);
236 Py_DECREF(v);
237 if (x == (Py_ssize_t)-1 && PyErr_Occurred()) {
238 if (PyErr_ExceptionMatches(PyExc_OverflowError))
239 PyErr_SetString(StructError,
240 "argument out of range");
241 return -1;
242 }
243 *p = x;
244 return 0;
245}
246
247/* Same, but handling size_t */
248
249static int
250get_size_t(PyObject *v, size_t *p)
251{
252 size_t x;
253
254 v = get_pylong(v);
255 if (v == NULL)
256 return -1;
257 assert(PyLong_Check(v));
258 x = PyLong_AsSize_t(v);
259 Py_DECREF(v);
260 if (x == (size_t)-1 && PyErr_Occurred()) {
261 if (PyErr_ExceptionMatches(PyExc_OverflowError))
262 PyErr_SetString(StructError,
263 "argument out of range");
264 return -1;
265 }
266 *p = x;
267 return 0;
268}
269
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000270
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000271#define RANGE_ERROR(x, f, flag, mask) return _range_error(f, flag)
272
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000273
Thomas Wouters477c8d52006-05-27 19:21:47 +0000274/* Floating point helpers */
275
276static PyObject *
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100277unpack_halffloat(const char *p, /* start of 2-byte string */
278 int le) /* true for little-endian, false for big-endian */
279{
280 double x;
281
282 x = _PyFloat_Unpack2((unsigned char *)p, le);
283 if (x == -1.0 && PyErr_Occurred()) {
284 return NULL;
285 }
286 return PyFloat_FromDouble(x);
287}
288
289static int
290pack_halffloat(char *p, /* start of 2-byte string */
291 PyObject *v, /* value to pack */
292 int le) /* true for little-endian, false for big-endian */
293{
294 double x = PyFloat_AsDouble(v);
295 if (x == -1.0 && PyErr_Occurred()) {
296 PyErr_SetString(StructError,
297 "required argument is not a float");
298 return -1;
299 }
300 return _PyFloat_Pack2(x, (unsigned char *)p, le);
301}
302
303static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +0000304unpack_float(const char *p, /* start of 4-byte string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 int le) /* true for little-endian, false for big-endian */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 double x;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 x = _PyFloat_Unpack4((unsigned char *)p, le);
310 if (x == -1.0 && PyErr_Occurred())
311 return NULL;
312 return PyFloat_FromDouble(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000313}
314
315static PyObject *
316unpack_double(const char *p, /* start of 8-byte string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 int le) /* true for little-endian, false for big-endian */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 double x;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 x = _PyFloat_Unpack8((unsigned char *)p, le);
322 if (x == -1.0 && PyErr_Occurred())
323 return NULL;
324 return PyFloat_FromDouble(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000325}
326
327/* Helper to format the range error exceptions */
328static int
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000329_range_error(const formatdef *f, int is_unsigned)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 /* ulargest is the largest unsigned value with f->size bytes.
332 * Note that the simpler:
333 * ((size_t)1 << (f->size * 8)) - 1
334 * doesn't work when f->size == sizeof(size_t) because C doesn't
335 * define what happens when a left shift count is >= the number of
336 * bits in the integer being shifted; e.g., on some boxes it doesn't
337 * shift at all when they're equal.
338 */
339 const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8);
340 assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T);
341 if (is_unsigned)
342 PyErr_Format(StructError,
343 "'%c' format requires 0 <= number <= %zu",
344 f->format,
345 ulargest);
346 else {
347 const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1);
348 PyErr_Format(StructError,
349 "'%c' format requires %zd <= number <= %zd",
350 f->format,
351 ~ largest,
352 largest);
353 }
Mark Dickinsonae681df2009-03-21 10:26:31 +0000354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000356}
357
358
359
360/* A large number of small routines follow, with names of the form
361
362 [bln][up]_TYPE
363
364 [bln] distiguishes among big-endian, little-endian and native.
365 [pu] distiguishes between pack (to struct) and unpack (from struct).
366 TYPE is one of char, byte, ubyte, etc.
367*/
368
369/* Native mode routines. ****************************************************/
370/* NOTE:
371 In all n[up]_<type> routines handling types larger than 1 byte, there is
372 *no* guarantee that the p pointer is properly aligned for each type,
373 therefore memcpy is called. An intermediate variable is used to
374 compensate for big-endian architectures.
375 Normally both the intermediate variable and the memcpy call will be
376 skipped by C optimisation in little-endian architectures (gcc >= 2.91
377 does this). */
378
379static PyObject *
380nu_char(const char *p, const formatdef *f)
381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 return PyBytes_FromStringAndSize(p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000383}
384
385static PyObject *
386nu_byte(const char *p, const formatdef *f)
387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 return PyLong_FromLong((long) *(signed char *)p);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000389}
390
391static PyObject *
392nu_ubyte(const char *p, const formatdef *f)
393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 return PyLong_FromLong((long) *(unsigned char *)p);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000395}
396
397static PyObject *
398nu_short(const char *p, const formatdef *f)
399{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 short x;
401 memcpy((char *)&x, p, sizeof x);
402 return PyLong_FromLong((long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000403}
404
405static PyObject *
406nu_ushort(const char *p, const formatdef *f)
407{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 unsigned short x;
409 memcpy((char *)&x, p, sizeof x);
410 return PyLong_FromLong((long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000411}
412
413static PyObject *
414nu_int(const char *p, const formatdef *f)
415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 int x;
417 memcpy((char *)&x, p, sizeof x);
418 return PyLong_FromLong((long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000419}
420
421static PyObject *
422nu_uint(const char *p, const formatdef *f)
423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 unsigned int x;
425 memcpy((char *)&x, p, sizeof x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 return PyLong_FromUnsignedLong((unsigned long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000427}
428
429static PyObject *
430nu_long(const char *p, const formatdef *f)
431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 long x;
433 memcpy((char *)&x, p, sizeof x);
434 return PyLong_FromLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000435}
436
437static PyObject *
438nu_ulong(const char *p, const formatdef *f)
439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 unsigned long x;
441 memcpy((char *)&x, p, sizeof x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 return PyLong_FromUnsignedLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000443}
444
Antoine Pitrou45d9c912011-10-06 15:27:40 +0200445static PyObject *
446nu_ssize_t(const char *p, const formatdef *f)
447{
448 Py_ssize_t x;
449 memcpy((char *)&x, p, sizeof x);
450 return PyLong_FromSsize_t(x);
451}
452
453static PyObject *
454nu_size_t(const char *p, const formatdef *f)
455{
456 size_t x;
457 memcpy((char *)&x, p, sizeof x);
458 return PyLong_FromSize_t(x);
459}
460
Thomas Wouters477c8d52006-05-27 19:21:47 +0000461static PyObject *
462nu_longlong(const char *p, const formatdef *f)
463{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700464 long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 memcpy((char *)&x, p, sizeof x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 return PyLong_FromLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000467}
468
469static PyObject *
470nu_ulonglong(const char *p, const formatdef *f)
471{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700472 unsigned long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 memcpy((char *)&x, p, sizeof x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 return PyLong_FromUnsignedLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000475}
476
Thomas Wouters477c8d52006-05-27 19:21:47 +0000477static PyObject *
Thomas Woutersb2137042007-02-01 18:02:27 +0000478nu_bool(const char *p, const formatdef *f)
479{
Benjamin Petersona9296e72016-09-07 11:06:17 -0700480 _Bool x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 memcpy((char *)&x, p, sizeof x);
482 return PyBool_FromLong(x != 0);
Thomas Woutersb2137042007-02-01 18:02:27 +0000483}
484
485
486static PyObject *
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100487nu_halffloat(const char *p, const formatdef *f)
488{
489#if PY_LITTLE_ENDIAN
490 return unpack_halffloat(p, 1);
491#else
492 return unpack_halffloat(p, 0);
Benjamin Petersone2e792d2016-09-19 22:17:16 -0700493#endif
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100494}
495
496static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +0000497nu_float(const char *p, const formatdef *f)
498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 float x;
500 memcpy((char *)&x, p, sizeof x);
501 return PyFloat_FromDouble((double)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000502}
503
504static PyObject *
505nu_double(const char *p, const formatdef *f)
506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 double x;
508 memcpy((char *)&x, p, sizeof x);
509 return PyFloat_FromDouble(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000510}
511
512static PyObject *
513nu_void_p(const char *p, const formatdef *f)
514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 void *x;
516 memcpy((char *)&x, p, sizeof x);
517 return PyLong_FromVoidPtr(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000518}
519
520static int
521np_byte(char *p, PyObject *v, const formatdef *f)
522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 long x;
524 if (get_long(v, &x) < 0)
525 return -1;
Xiang Zhang96f50282017-05-15 11:53:51 +0800526 if (x < -128 || x > 127) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 PyErr_SetString(StructError,
528 "byte format requires -128 <= number <= 127");
529 return -1;
530 }
531 *p = (char)x;
532 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000533}
534
535static int
536np_ubyte(char *p, PyObject *v, const formatdef *f)
537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 long x;
539 if (get_long(v, &x) < 0)
540 return -1;
Xiang Zhang96f50282017-05-15 11:53:51 +0800541 if (x < 0 || x > 255) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 PyErr_SetString(StructError,
543 "ubyte format requires 0 <= number <= 255");
544 return -1;
545 }
546 *p = (char)x;
547 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000548}
549
550static int
551np_char(char *p, PyObject *v, const formatdef *f)
552{
Xiang Zhang96f50282017-05-15 11:53:51 +0800553 if (!PyBytes_Check(v) || PyBytes_GET_SIZE(v) != 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 PyErr_SetString(StructError,
Victor Stinnerda9ec992010-12-28 13:26:42 +0000555 "char format requires a bytes object of length 1");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 return -1;
557 }
Xiang Zhang96f50282017-05-15 11:53:51 +0800558 *p = *PyBytes_AS_STRING(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000560}
561
562static int
563np_short(char *p, PyObject *v, const formatdef *f)
564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 long x;
566 short y;
567 if (get_long(v, &x) < 0)
568 return -1;
Xiang Zhang96f50282017-05-15 11:53:51 +0800569 if (x < SHRT_MIN || x > SHRT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 PyErr_SetString(StructError,
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200571 "short format requires " Py_STRINGIFY(SHRT_MIN)
572 " <= number <= " Py_STRINGIFY(SHRT_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 return -1;
574 }
575 y = (short)x;
576 memcpy(p, (char *)&y, sizeof y);
577 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000578}
579
580static int
581np_ushort(char *p, PyObject *v, const formatdef *f)
582{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 long x;
584 unsigned short y;
585 if (get_long(v, &x) < 0)
586 return -1;
Xiang Zhang96f50282017-05-15 11:53:51 +0800587 if (x < 0 || x > USHRT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 PyErr_SetString(StructError,
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200589 "ushort format requires 0 <= number <= "
590 Py_STRINGIFY(USHRT_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return -1;
592 }
593 y = (unsigned short)x;
594 memcpy(p, (char *)&y, sizeof y);
595 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000596}
597
598static int
599np_int(char *p, PyObject *v, const formatdef *f)
600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 long x;
602 int y;
603 if (get_long(v, &x) < 0)
604 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000605#if (SIZEOF_LONG > SIZEOF_INT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))
607 RANGE_ERROR(x, f, 0, -1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 y = (int)x;
610 memcpy(p, (char *)&y, sizeof y);
611 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000612}
613
614static int
615np_uint(char *p, PyObject *v, const formatdef *f)
616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 unsigned long x;
618 unsigned int y;
619 if (get_ulong(v, &x) < 0)
620 return -1;
621 y = (unsigned int)x;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000622#if (SIZEOF_LONG > SIZEOF_INT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 if (x > ((unsigned long)UINT_MAX))
624 RANGE_ERROR(y, f, 1, -1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 memcpy(p, (char *)&y, sizeof y);
627 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000628}
629
630static int
631np_long(char *p, PyObject *v, const formatdef *f)
632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 long x;
634 if (get_long(v, &x) < 0)
635 return -1;
636 memcpy(p, (char *)&x, sizeof x);
637 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000638}
639
640static int
641np_ulong(char *p, PyObject *v, const formatdef *f)
642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 unsigned long x;
644 if (get_ulong(v, &x) < 0)
645 return -1;
646 memcpy(p, (char *)&x, sizeof x);
647 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000648}
649
Antoine Pitrou45d9c912011-10-06 15:27:40 +0200650static int
651np_ssize_t(char *p, PyObject *v, const formatdef *f)
652{
653 Py_ssize_t x;
654 if (get_ssize_t(v, &x) < 0)
655 return -1;
656 memcpy(p, (char *)&x, sizeof x);
657 return 0;
658}
659
660static int
661np_size_t(char *p, PyObject *v, const formatdef *f)
662{
663 size_t x;
664 if (get_size_t(v, &x) < 0)
665 return -1;
666 memcpy(p, (char *)&x, sizeof x);
667 return 0;
668}
669
Thomas Wouters477c8d52006-05-27 19:21:47 +0000670static int
671np_longlong(char *p, PyObject *v, const formatdef *f)
672{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700673 long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 if (get_longlong(v, &x) < 0)
675 return -1;
676 memcpy(p, (char *)&x, sizeof x);
677 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000678}
679
680static int
681np_ulonglong(char *p, PyObject *v, const formatdef *f)
682{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700683 unsigned long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (get_ulonglong(v, &x) < 0)
685 return -1;
686 memcpy(p, (char *)&x, sizeof x);
687 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000688}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000689
Thomas Woutersb2137042007-02-01 18:02:27 +0000690
691static int
692np_bool(char *p, PyObject *v, const formatdef *f)
693{
Benjamin Petersonde73c452010-07-07 18:54:59 +0000694 int y;
Benjamin Petersona9296e72016-09-07 11:06:17 -0700695 _Bool x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 y = PyObject_IsTrue(v);
Benjamin Petersonde73c452010-07-07 18:54:59 +0000697 if (y < 0)
698 return -1;
699 x = y;
700 memcpy(p, (char *)&x, sizeof x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 return 0;
Thomas Woutersb2137042007-02-01 18:02:27 +0000702}
703
Thomas Wouters477c8d52006-05-27 19:21:47 +0000704static int
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100705np_halffloat(char *p, PyObject *v, const formatdef *f)
706{
707#if PY_LITTLE_ENDIAN
708 return pack_halffloat(p, v, 1);
709#else
710 return pack_halffloat(p, v, 0);
711#endif
712}
713
714static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000715np_float(char *p, PyObject *v, const formatdef *f)
716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 float x = (float)PyFloat_AsDouble(v);
718 if (x == -1 && PyErr_Occurred()) {
719 PyErr_SetString(StructError,
720 "required argument is not a float");
721 return -1;
722 }
723 memcpy(p, (char *)&x, sizeof x);
724 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000725}
726
727static int
728np_double(char *p, PyObject *v, const formatdef *f)
729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 double x = PyFloat_AsDouble(v);
731 if (x == -1 && PyErr_Occurred()) {
732 PyErr_SetString(StructError,
733 "required argument is not a float");
734 return -1;
735 }
736 memcpy(p, (char *)&x, sizeof(double));
737 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000738}
739
740static int
741np_void_p(char *p, PyObject *v, const formatdef *f)
742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 void *x;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 v = get_pylong(v);
746 if (v == NULL)
747 return -1;
748 assert(PyLong_Check(v));
749 x = PyLong_AsVoidPtr(v);
750 Py_DECREF(v);
751 if (x == NULL && PyErr_Occurred())
752 return -1;
753 memcpy(p, (char *)&x, sizeof x);
754 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000755}
756
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200757static const formatdef native_table[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 {'x', sizeof(char), 0, NULL},
759 {'b', sizeof(char), 0, nu_byte, np_byte},
760 {'B', sizeof(char), 0, nu_ubyte, np_ubyte},
761 {'c', sizeof(char), 0, nu_char, np_char},
762 {'s', sizeof(char), 0, NULL},
763 {'p', sizeof(char), 0, NULL},
764 {'h', sizeof(short), SHORT_ALIGN, nu_short, np_short},
765 {'H', sizeof(short), SHORT_ALIGN, nu_ushort, np_ushort},
766 {'i', sizeof(int), INT_ALIGN, nu_int, np_int},
767 {'I', sizeof(int), INT_ALIGN, nu_uint, np_uint},
768 {'l', sizeof(long), LONG_ALIGN, nu_long, np_long},
769 {'L', sizeof(long), LONG_ALIGN, nu_ulong, np_ulong},
Antoine Pitrou45d9c912011-10-06 15:27:40 +0200770 {'n', sizeof(size_t), SIZE_T_ALIGN, nu_ssize_t, np_ssize_t},
771 {'N', sizeof(size_t), SIZE_T_ALIGN, nu_size_t, np_size_t},
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700772 {'q', sizeof(long long), LONG_LONG_ALIGN, nu_longlong, np_longlong},
773 {'Q', sizeof(long long), LONG_LONG_ALIGN, nu_ulonglong,np_ulonglong},
Benjamin Petersona9296e72016-09-07 11:06:17 -0700774 {'?', sizeof(_Bool), BOOL_ALIGN, nu_bool, np_bool},
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100775 {'e', sizeof(short), SHORT_ALIGN, nu_halffloat, np_halffloat},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 {'f', sizeof(float), FLOAT_ALIGN, nu_float, np_float},
777 {'d', sizeof(double), DOUBLE_ALIGN, nu_double, np_double},
778 {'P', sizeof(void *), VOID_P_ALIGN, nu_void_p, np_void_p},
779 {0}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000780};
781
782/* Big-endian routines. *****************************************************/
783
784static PyObject *
785bu_int(const char *p, const formatdef *f)
786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 long x = 0;
788 Py_ssize_t i = f->size;
789 const unsigned char *bytes = (const unsigned char *)p;
790 do {
791 x = (x<<8) | *bytes++;
792 } while (--i > 0);
793 /* Extend the sign bit. */
794 if (SIZEOF_LONG > f->size)
795 x |= -(x & (1L << ((8 * f->size) - 1)));
796 return PyLong_FromLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000797}
798
799static PyObject *
800bu_uint(const char *p, const formatdef *f)
801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 unsigned long x = 0;
803 Py_ssize_t i = f->size;
804 const unsigned char *bytes = (const unsigned char *)p;
805 do {
806 x = (x<<8) | *bytes++;
807 } while (--i > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 return PyLong_FromUnsignedLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000809}
810
811static PyObject *
812bu_longlong(const char *p, const formatdef *f)
813{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700814 long long x = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 Py_ssize_t i = f->size;
816 const unsigned char *bytes = (const unsigned char *)p;
817 do {
818 x = (x<<8) | *bytes++;
819 } while (--i > 0);
820 /* Extend the sign bit. */
821 if (SIZEOF_LONG_LONG > f->size)
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700822 x |= -(x & ((long long)1 << ((8 * f->size) - 1)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 return PyLong_FromLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000824}
825
826static PyObject *
827bu_ulonglong(const char *p, const formatdef *f)
828{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700829 unsigned long long x = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 Py_ssize_t i = f->size;
831 const unsigned char *bytes = (const unsigned char *)p;
832 do {
833 x = (x<<8) | *bytes++;
834 } while (--i > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 return PyLong_FromUnsignedLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000836}
837
838static PyObject *
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100839bu_halffloat(const char *p, const formatdef *f)
840{
841 return unpack_halffloat(p, 0);
842}
843
844static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +0000845bu_float(const char *p, const formatdef *f)
846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 return unpack_float(p, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000848}
849
850static PyObject *
851bu_double(const char *p, const formatdef *f)
852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 return unpack_double(p, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000854}
855
Thomas Woutersb2137042007-02-01 18:02:27 +0000856static PyObject *
857bu_bool(const char *p, const formatdef *f)
858{
Xiang Zhang96f50282017-05-15 11:53:51 +0800859 return PyBool_FromLong(*p != 0);
Thomas Woutersb2137042007-02-01 18:02:27 +0000860}
861
Thomas Wouters477c8d52006-05-27 19:21:47 +0000862static int
863bp_int(char *p, PyObject *v, const formatdef *f)
864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 long x;
866 Py_ssize_t i;
867 if (get_long(v, &x) < 0)
868 return -1;
869 i = f->size;
870 if (i != SIZEOF_LONG) {
871 if ((i == 2) && (x < -32768 || x > 32767))
872 RANGE_ERROR(x, f, 0, 0xffffL);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000873#if (SIZEOF_LONG != 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 else if ((i == 4) && (x < -2147483648L || x > 2147483647L))
875 RANGE_ERROR(x, f, 0, 0xffffffffL);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 }
878 do {
879 p[--i] = (char)x;
880 x >>= 8;
881 } while (i > 0);
882 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000883}
884
885static int
886bp_uint(char *p, PyObject *v, const formatdef *f)
887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 unsigned long x;
889 Py_ssize_t i;
890 if (get_ulong(v, &x) < 0)
891 return -1;
892 i = f->size;
893 if (i != SIZEOF_LONG) {
894 unsigned long maxint = 1;
895 maxint <<= (unsigned long)(i * 8);
896 if (x >= maxint)
897 RANGE_ERROR(x, f, 1, maxint - 1);
898 }
899 do {
900 p[--i] = (char)x;
901 x >>= 8;
902 } while (i > 0);
903 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000904}
905
906static int
907bp_longlong(char *p, PyObject *v, const formatdef *f)
908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 int res;
910 v = get_pylong(v);
911 if (v == NULL)
912 return -1;
913 res = _PyLong_AsByteArray((PyLongObject *)v,
914 (unsigned char *)p,
915 8,
916 0, /* little_endian */
Xiang Zhang96f50282017-05-15 11:53:51 +0800917 1 /* signed */);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 Py_DECREF(v);
919 return res;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000920}
921
922static int
923bp_ulonglong(char *p, PyObject *v, const formatdef *f)
924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 int res;
926 v = get_pylong(v);
927 if (v == NULL)
928 return -1;
929 res = _PyLong_AsByteArray((PyLongObject *)v,
930 (unsigned char *)p,
931 8,
932 0, /* little_endian */
Xiang Zhang96f50282017-05-15 11:53:51 +0800933 0 /* signed */);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 Py_DECREF(v);
935 return res;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000936}
937
938static int
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100939bp_halffloat(char *p, PyObject *v, const formatdef *f)
940{
941 return pack_halffloat(p, v, 0);
942}
943
944static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000945bp_float(char *p, PyObject *v, const formatdef *f)
946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 double x = PyFloat_AsDouble(v);
948 if (x == -1 && PyErr_Occurred()) {
949 PyErr_SetString(StructError,
950 "required argument is not a float");
951 return -1;
952 }
953 return _PyFloat_Pack4(x, (unsigned char *)p, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000954}
955
956static int
957bp_double(char *p, PyObject *v, const formatdef *f)
958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 double x = PyFloat_AsDouble(v);
960 if (x == -1 && PyErr_Occurred()) {
961 PyErr_SetString(StructError,
962 "required argument is not a float");
963 return -1;
964 }
965 return _PyFloat_Pack8(x, (unsigned char *)p, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000966}
967
Thomas Woutersb2137042007-02-01 18:02:27 +0000968static int
969bp_bool(char *p, PyObject *v, const formatdef *f)
970{
Mark Dickinsoneff5d852010-07-18 07:29:02 +0000971 int y;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 y = PyObject_IsTrue(v);
Benjamin Petersonde73c452010-07-07 18:54:59 +0000973 if (y < 0)
974 return -1;
Mark Dickinsoneff5d852010-07-18 07:29:02 +0000975 *p = (char)y;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 return 0;
Thomas Woutersb2137042007-02-01 18:02:27 +0000977}
978
Thomas Wouters477c8d52006-05-27 19:21:47 +0000979static formatdef bigendian_table[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 {'x', 1, 0, NULL},
981 {'b', 1, 0, nu_byte, np_byte},
982 {'B', 1, 0, nu_ubyte, np_ubyte},
983 {'c', 1, 0, nu_char, np_char},
984 {'s', 1, 0, NULL},
985 {'p', 1, 0, NULL},
986 {'h', 2, 0, bu_int, bp_int},
987 {'H', 2, 0, bu_uint, bp_uint},
988 {'i', 4, 0, bu_int, bp_int},
989 {'I', 4, 0, bu_uint, bp_uint},
990 {'l', 4, 0, bu_int, bp_int},
991 {'L', 4, 0, bu_uint, bp_uint},
992 {'q', 8, 0, bu_longlong, bp_longlong},
993 {'Q', 8, 0, bu_ulonglong, bp_ulonglong},
994 {'?', 1, 0, bu_bool, bp_bool},
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100995 {'e', 2, 0, bu_halffloat, bp_halffloat},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 {'f', 4, 0, bu_float, bp_float},
997 {'d', 8, 0, bu_double, bp_double},
998 {0}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000999};
1000
1001/* Little-endian routines. *****************************************************/
1002
1003static PyObject *
1004lu_int(const char *p, const formatdef *f)
1005{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 long x = 0;
1007 Py_ssize_t i = f->size;
1008 const unsigned char *bytes = (const unsigned char *)p;
1009 do {
1010 x = (x<<8) | bytes[--i];
1011 } while (i > 0);
1012 /* Extend the sign bit. */
1013 if (SIZEOF_LONG > f->size)
1014 x |= -(x & (1L << ((8 * f->size) - 1)));
1015 return PyLong_FromLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001016}
1017
1018static PyObject *
1019lu_uint(const char *p, const formatdef *f)
1020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 unsigned long x = 0;
1022 Py_ssize_t i = f->size;
1023 const unsigned char *bytes = (const unsigned char *)p;
1024 do {
1025 x = (x<<8) | bytes[--i];
1026 } while (i > 0);
Xiang Zhang96f50282017-05-15 11:53:51 +08001027 return PyLong_FromUnsignedLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001028}
1029
1030static PyObject *
1031lu_longlong(const char *p, const formatdef *f)
1032{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001033 long long x = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 Py_ssize_t i = f->size;
1035 const unsigned char *bytes = (const unsigned char *)p;
1036 do {
1037 x = (x<<8) | bytes[--i];
1038 } while (i > 0);
1039 /* Extend the sign bit. */
1040 if (SIZEOF_LONG_LONG > f->size)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001041 x |= -(x & ((long long)1 << ((8 * f->size) - 1)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 return PyLong_FromLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001043}
1044
1045static PyObject *
1046lu_ulonglong(const char *p, const formatdef *f)
1047{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001048 unsigned long long x = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 Py_ssize_t i = f->size;
1050 const unsigned char *bytes = (const unsigned char *)p;
1051 do {
1052 x = (x<<8) | bytes[--i];
1053 } while (i > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 return PyLong_FromUnsignedLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055}
1056
1057static PyObject *
Mark Dickinson7c4e4092016-09-03 17:21:29 +01001058lu_halffloat(const char *p, const formatdef *f)
1059{
1060 return unpack_halffloat(p, 1);
1061}
1062
1063static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001064lu_float(const char *p, const formatdef *f)
1065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 return unpack_float(p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001067}
1068
1069static PyObject *
1070lu_double(const char *p, const formatdef *f)
1071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 return unpack_double(p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001073}
1074
1075static int
1076lp_int(char *p, PyObject *v, const formatdef *f)
1077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 long x;
1079 Py_ssize_t i;
1080 if (get_long(v, &x) < 0)
1081 return -1;
1082 i = f->size;
1083 if (i != SIZEOF_LONG) {
1084 if ((i == 2) && (x < -32768 || x > 32767))
1085 RANGE_ERROR(x, f, 0, 0xffffL);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001086#if (SIZEOF_LONG != 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 else if ((i == 4) && (x < -2147483648L || x > 2147483647L))
1088 RANGE_ERROR(x, f, 0, 0xffffffffL);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 }
1091 do {
1092 *p++ = (char)x;
1093 x >>= 8;
1094 } while (--i > 0);
1095 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001096}
1097
1098static int
1099lp_uint(char *p, PyObject *v, const formatdef *f)
1100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 unsigned long x;
1102 Py_ssize_t i;
1103 if (get_ulong(v, &x) < 0)
1104 return -1;
1105 i = f->size;
1106 if (i != SIZEOF_LONG) {
1107 unsigned long maxint = 1;
1108 maxint <<= (unsigned long)(i * 8);
1109 if (x >= maxint)
1110 RANGE_ERROR(x, f, 1, maxint - 1);
1111 }
1112 do {
1113 *p++ = (char)x;
1114 x >>= 8;
1115 } while (--i > 0);
1116 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001117}
1118
1119static int
1120lp_longlong(char *p, PyObject *v, const formatdef *f)
1121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 int res;
1123 v = get_pylong(v);
1124 if (v == NULL)
1125 return -1;
1126 res = _PyLong_AsByteArray((PyLongObject*)v,
1127 (unsigned char *)p,
1128 8,
1129 1, /* little_endian */
Xiang Zhang96f50282017-05-15 11:53:51 +08001130 1 /* signed */);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 Py_DECREF(v);
1132 return res;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001133}
1134
1135static int
1136lp_ulonglong(char *p, PyObject *v, const formatdef *f)
1137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 int res;
1139 v = get_pylong(v);
1140 if (v == NULL)
1141 return -1;
1142 res = _PyLong_AsByteArray((PyLongObject*)v,
1143 (unsigned char *)p,
1144 8,
1145 1, /* little_endian */
Xiang Zhang96f50282017-05-15 11:53:51 +08001146 0 /* signed */);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 Py_DECREF(v);
1148 return res;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001149}
1150
1151static int
Mark Dickinson7c4e4092016-09-03 17:21:29 +01001152lp_halffloat(char *p, PyObject *v, const formatdef *f)
1153{
1154 return pack_halffloat(p, v, 1);
1155}
1156
1157static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001158lp_float(char *p, PyObject *v, const formatdef *f)
1159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 double x = PyFloat_AsDouble(v);
1161 if (x == -1 && PyErr_Occurred()) {
1162 PyErr_SetString(StructError,
1163 "required argument is not a float");
1164 return -1;
1165 }
1166 return _PyFloat_Pack4(x, (unsigned char *)p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001167}
1168
1169static int
1170lp_double(char *p, PyObject *v, const formatdef *f)
1171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 double x = PyFloat_AsDouble(v);
1173 if (x == -1 && PyErr_Occurred()) {
1174 PyErr_SetString(StructError,
1175 "required argument is not a float");
1176 return -1;
1177 }
1178 return _PyFloat_Pack8(x, (unsigned char *)p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001179}
1180
1181static formatdef lilendian_table[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 {'x', 1, 0, NULL},
1183 {'b', 1, 0, nu_byte, np_byte},
1184 {'B', 1, 0, nu_ubyte, np_ubyte},
1185 {'c', 1, 0, nu_char, np_char},
1186 {'s', 1, 0, NULL},
1187 {'p', 1, 0, NULL},
1188 {'h', 2, 0, lu_int, lp_int},
1189 {'H', 2, 0, lu_uint, lp_uint},
1190 {'i', 4, 0, lu_int, lp_int},
1191 {'I', 4, 0, lu_uint, lp_uint},
1192 {'l', 4, 0, lu_int, lp_int},
1193 {'L', 4, 0, lu_uint, lp_uint},
1194 {'q', 8, 0, lu_longlong, lp_longlong},
1195 {'Q', 8, 0, lu_ulonglong, lp_ulonglong},
1196 {'?', 1, 0, bu_bool, bp_bool}, /* Std rep not endian dep,
1197 but potentially different from native rep -- reuse bx_bool funcs. */
Mark Dickinson7c4e4092016-09-03 17:21:29 +01001198 {'e', 2, 0, lu_halffloat, lp_halffloat},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 {'f', 4, 0, lu_float, lp_float},
1200 {'d', 8, 0, lu_double, lp_double},
1201 {0}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001202};
1203
1204
1205static const formatdef *
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001206whichtable(const char **pfmt)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 const char *fmt = (*pfmt)++; /* May be backed out of later */
1209 switch (*fmt) {
1210 case '<':
1211 return lilendian_table;
1212 case '>':
1213 case '!': /* Network byte order is big-endian */
1214 return bigendian_table;
Ezio Melotti42da6632011-03-15 05:18:48 +02001215 case '=': { /* Host byte order -- different from native in alignment! */
Christian Heimes743e0cd2012-10-17 23:52:17 +02001216#if PY_LITTLE_ENDIAN
1217 return lilendian_table;
1218#else
1219 return bigendian_table;
1220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 }
1222 default:
1223 --*pfmt; /* Back out of pointer increment */
1224 /* Fall through */
1225 case '@':
1226 return native_table;
1227 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001228}
1229
1230
1231/* Get the table entry for a format code */
1232
1233static const formatdef *
1234getentry(int c, const formatdef *f)
1235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 for (; f->format != '\0'; f++) {
1237 if (f->format == c) {
1238 return f;
1239 }
1240 }
1241 PyErr_SetString(StructError, "bad char in struct format");
1242 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001243}
1244
1245
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001246/* Align a size according to a format code. Return -1 on overflow. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001247
Mark Dickinsoneac0e682010-06-11 19:05:08 +00001248static Py_ssize_t
Thomas Wouters477c8d52006-05-27 19:21:47 +00001249align(Py_ssize_t size, char c, const formatdef *e)
1250{
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001251 Py_ssize_t extra;
1252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 if (e->format == c) {
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001254 if (e->alignment && size > 0) {
1255 extra = (e->alignment - 1) - (size - 1) % (e->alignment);
1256 if (extra > PY_SSIZE_T_MAX - size)
1257 return -1;
1258 size += extra;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 }
1260 }
1261 return size;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001262}
1263
Antoine Pitrou9f146812013-04-27 00:20:04 +02001264/*
1265 * Struct object implementation.
1266 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001267
1268/* calculate the size of a format string */
1269
1270static int
1271prepare_s(PyStructObject *self)
1272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 const formatdef *f;
1274 const formatdef *e;
1275 formatcode *codes;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 const char *s;
1278 const char *fmt;
1279 char c;
Victor Stinner706768c2014-08-16 01:03:39 +02001280 Py_ssize_t size, len, num, itemsize;
1281 size_t ncodes;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 fmt = PyBytes_AS_STRING(self->s_format);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001284
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001285 f = whichtable(&fmt);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 s = fmt;
1288 size = 0;
1289 len = 0;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001290 ncodes = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 while ((c = *s++) != '\0') {
Antoine Pitrou4de74572013-02-09 23:11:27 +01001292 if (Py_ISSPACE(Py_CHARMASK(c)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 continue;
1294 if ('0' <= c && c <= '9') {
1295 num = c - '0';
1296 while ('0' <= (c = *s++) && c <= '9') {
Mark Dickinsonab4096f2010-06-11 16:56:34 +00001297 /* overflow-safe version of
1298 if (num*10 + (c - '0') > PY_SSIZE_T_MAX) { ... } */
1299 if (num >= PY_SSIZE_T_MAX / 10 && (
1300 num > PY_SSIZE_T_MAX / 10 ||
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001301 (c - '0') > PY_SSIZE_T_MAX % 10))
1302 goto overflow;
Mark Dickinsonab4096f2010-06-11 16:56:34 +00001303 num = num*10 + (c - '0');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 }
Alexander Belopolsky177e8532010-06-11 16:04:59 +00001305 if (c == '\0') {
1306 PyErr_SetString(StructError,
1307 "repeat count given without format specifier");
1308 return -1;
1309 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 }
1311 else
1312 num = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 e = getentry(c, f);
1315 if (e == NULL)
1316 return -1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 switch (c) {
1319 case 's': /* fall through */
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001320 case 'p': len++; ncodes++; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 case 'x': break;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001322 default: len += num; if (num) ncodes++; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 itemsize = e->size;
1326 size = align(size, c, e);
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001327 if (size == -1)
1328 goto overflow;
1329
1330 /* if (size + num * itemsize > PY_SSIZE_T_MAX) { ... } */
1331 if (num > (PY_SSIZE_T_MAX - size) / itemsize)
1332 goto overflow;
1333 size += num * itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 /* check for overflow */
Victor Stinner706768c2014-08-16 01:03:39 +02001337 if ((ncodes + 1) > ((size_t)PY_SSIZE_T_MAX / sizeof(formatcode))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 PyErr_NoMemory();
1339 return -1;
1340 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +00001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 self->s_size = size;
1343 self->s_len = len;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001344 codes = PyMem_MALLOC((ncodes + 1) * sizeof(formatcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 if (codes == NULL) {
1346 PyErr_NoMemory();
1347 return -1;
1348 }
Mark Dickinsoncf28b952010-07-29 21:41:59 +00001349 /* Free any s_codes value left over from a previous initialization. */
1350 if (self->s_codes != NULL)
1351 PyMem_FREE(self->s_codes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 self->s_codes = codes;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 s = fmt;
1355 size = 0;
1356 while ((c = *s++) != '\0') {
Antoine Pitrou4de74572013-02-09 23:11:27 +01001357 if (Py_ISSPACE(Py_CHARMASK(c)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 continue;
1359 if ('0' <= c && c <= '9') {
1360 num = c - '0';
1361 while ('0' <= (c = *s++) && c <= '9')
1362 num = num*10 + (c - '0');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 }
1364 else
1365 num = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 e = getentry(c, f);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 size = align(size, c, e);
1370 if (c == 's' || c == 'p') {
1371 codes->offset = size;
1372 codes->size = num;
1373 codes->fmtdef = e;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001374 codes->repeat = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 codes++;
1376 size += num;
1377 } else if (c == 'x') {
1378 size += num;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001379 } else if (num) {
1380 codes->offset = size;
1381 codes->size = e->size;
1382 codes->fmtdef = e;
1383 codes->repeat = num;
1384 codes++;
1385 size += e->size * num;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 }
1387 }
1388 codes->fmtdef = NULL;
1389 codes->offset = size;
1390 codes->size = 0;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001391 codes->repeat = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 return 0;
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001394
1395 overflow:
1396 PyErr_SetString(StructError,
1397 "total struct size too long");
1398 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001399}
1400
1401static PyObject *
1402s_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PyObject *self;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 assert(type != NULL && type->tp_alloc != NULL);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 self = type->tp_alloc(type, 0);
1409 if (self != NULL) {
1410 PyStructObject *s = (PyStructObject*)self;
1411 Py_INCREF(Py_None);
1412 s->s_format = Py_None;
1413 s->s_codes = NULL;
1414 s->s_size = -1;
1415 s->s_len = -1;
1416 }
1417 return self;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001418}
1419
Victor Stinner3f2d1012017-02-02 12:09:30 +01001420/*[clinic input]
1421Struct.__init__
1422
1423 format: object
1424
1425Create a compiled struct object.
1426
1427Return a new Struct object which writes and reads binary data according to
1428the format string.
1429
1430See help(struct) for more on format strings.
1431[clinic start generated code]*/
1432
Thomas Wouters477c8d52006-05-27 19:21:47 +00001433static int
Victor Stinner3f2d1012017-02-02 12:09:30 +01001434Struct___init___impl(PyStructObject *self, PyObject *format)
1435/*[clinic end generated code: output=b8e80862444e92d0 input=192a4575a3dde802]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 int ret = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001438
Victor Stinner3f2d1012017-02-02 12:09:30 +01001439 if (PyUnicode_Check(format)) {
1440 format = PyUnicode_AsASCIIString(format);
1441 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 return -1;
1443 }
1444 /* XXX support buffer interface, too */
1445 else {
Victor Stinner3f2d1012017-02-02 12:09:30 +01001446 Py_INCREF(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 }
Christian Heimesa34706f2008-01-04 03:06:10 +00001448
Victor Stinner3f2d1012017-02-02 12:09:30 +01001449 if (!PyBytes_Check(format)) {
1450 Py_DECREF(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 PyErr_Format(PyExc_TypeError,
Victor Stinnerda9ec992010-12-28 13:26:42 +00001452 "Struct() argument 1 must be a bytes object, not %.200s",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001453 Py_TYPE(format)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 return -1;
1455 }
Christian Heimesa34706f2008-01-04 03:06:10 +00001456
Xiang Zhang96f50282017-05-15 11:53:51 +08001457 Py_SETREF(self->s_format, format);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001458
Victor Stinner3f2d1012017-02-02 12:09:30 +01001459 ret = prepare_s(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 return ret;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001461}
1462
1463static void
1464s_dealloc(PyStructObject *s)
1465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 if (s->weakreflist != NULL)
1467 PyObject_ClearWeakRefs((PyObject *)s);
1468 if (s->s_codes != NULL) {
1469 PyMem_FREE(s->s_codes);
1470 }
Xiang Zhang96f50282017-05-15 11:53:51 +08001471 Py_DECREF(s->s_format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 Py_TYPE(s)->tp_free((PyObject *)s);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001473}
1474
1475static PyObject *
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001476s_unpack_internal(PyStructObject *soself, const char *startfrom) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 formatcode *code;
1478 Py_ssize_t i = 0;
1479 PyObject *result = PyTuple_New(soself->s_len);
1480 if (result == NULL)
1481 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 for (code = soself->s_codes; code->fmtdef != NULL; code++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 const formatdef *e = code->fmtdef;
1485 const char *res = startfrom + code->offset;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001486 Py_ssize_t j = code->repeat;
1487 while (j--) {
1488 PyObject *v;
1489 if (e->format == 's') {
1490 v = PyBytes_FromStringAndSize(res, code->size);
1491 } else if (e->format == 'p') {
1492 Py_ssize_t n = *(unsigned char*)res;
1493 if (n >= code->size)
1494 n = code->size - 1;
1495 v = PyBytes_FromStringAndSize(res + 1, n);
1496 } else {
1497 v = e->unpack(res, e);
1498 }
1499 if (v == NULL)
1500 goto fail;
1501 PyTuple_SET_ITEM(result, i++, v);
1502 res += code->size;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001507fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 Py_DECREF(result);
1509 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001510}
1511
1512
Victor Stinner3f2d1012017-02-02 12:09:30 +01001513/*[clinic input]
1514Struct.unpack
1515
1516 buffer: Py_buffer
1517 /
1518
1519Return a tuple containing unpacked values.
1520
1521Unpack according to the format string Struct.format. The buffer's size
1522in bytes must be Struct.size.
1523
1524See help(struct) for more on format strings.
1525[clinic start generated code]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001526
1527static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001528Struct_unpack_impl(PyStructObject *self, Py_buffer *buffer)
1529/*[clinic end generated code: output=873a24faf02e848a input=3113f8e7038b2f6c]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001530{
Victor Stinner3f2d1012017-02-02 12:09:30 +01001531 assert(self->s_codes != NULL);
1532 if (buffer->len != self->s_size) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 PyErr_Format(StructError,
Victor Stinnerda9ec992010-12-28 13:26:42 +00001534 "unpack requires a bytes object of length %zd",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001535 self->s_size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 return NULL;
1537 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001538 return s_unpack_internal(self, buffer->buf);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001539}
1540
Victor Stinner3f2d1012017-02-02 12:09:30 +01001541/*[clinic input]
1542Struct.unpack_from
1543
1544 buffer: Py_buffer
1545 offset: Py_ssize_t = 0
1546
1547Return a tuple containing unpacked values.
1548
1549Values are unpacked according to the format string Struct.format.
1550
1551The buffer's size in bytes, minus offset, must be at least Struct.size.
1552
1553See help(struct) for more on format strings.
1554[clinic start generated code]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001555
1556static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001557Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer,
1558 Py_ssize_t offset)
1559/*[clinic end generated code: output=57fac875e0977316 input=97ade52422f8962f]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001560{
Victor Stinner3f2d1012017-02-02 12:09:30 +01001561 assert(self->s_codes != NULL);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 if (offset < 0)
Victor Stinner3f2d1012017-02-02 12:09:30 +01001564 offset += buffer->len;
1565 if (offset < 0 || buffer->len - offset < self->s_size) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 PyErr_Format(StructError,
1567 "unpack_from requires a buffer of at least %zd bytes",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001568 self->s_size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 return NULL;
1570 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001571 return s_unpack_internal(self, (char*)buffer->buf + offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001572}
1573
1574
Victor Stinner3f2d1012017-02-02 12:09:30 +01001575
Antoine Pitrou9f146812013-04-27 00:20:04 +02001576/* Unpack iterator type */
1577
1578typedef struct {
1579 PyObject_HEAD
1580 PyStructObject *so;
1581 Py_buffer buf;
1582 Py_ssize_t index;
1583} unpackiterobject;
1584
1585static void
1586unpackiter_dealloc(unpackiterobject *self)
1587{
1588 Py_XDECREF(self->so);
1589 PyBuffer_Release(&self->buf);
1590 PyObject_GC_Del(self);
1591}
1592
1593static int
1594unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg)
1595{
1596 Py_VISIT(self->so);
1597 Py_VISIT(self->buf.obj);
1598 return 0;
1599}
1600
1601static PyObject *
1602unpackiter_len(unpackiterobject *self)
1603{
1604 Py_ssize_t len;
1605 if (self->so == NULL)
1606 len = 0;
1607 else
1608 len = (self->buf.len - self->index) / self->so->s_size;
1609 return PyLong_FromSsize_t(len);
1610}
1611
1612static PyMethodDef unpackiter_methods[] = {
1613 {"__length_hint__", (PyCFunction) unpackiter_len, METH_NOARGS, NULL},
1614 {NULL, NULL} /* sentinel */
1615};
1616
1617static PyObject *
1618unpackiter_iternext(unpackiterobject *self)
1619{
1620 PyObject *result;
1621 if (self->so == NULL)
1622 return NULL;
1623 if (self->index >= self->buf.len) {
1624 /* Iterator exhausted */
1625 Py_CLEAR(self->so);
1626 PyBuffer_Release(&self->buf);
1627 return NULL;
1628 }
1629 assert(self->index + self->so->s_size <= self->buf.len);
1630 result = s_unpack_internal(self->so,
1631 (char*) self->buf.buf + self->index);
1632 self->index += self->so->s_size;
1633 return result;
1634}
1635
doko@ubuntu.com46c5deb2013-11-23 16:07:55 +01001636static PyTypeObject unpackiter_type = {
Zachary Ware854adb12016-10-02 00:33:39 -05001637 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrou9f146812013-04-27 00:20:04 +02001638 "unpack_iterator", /* tp_name */
1639 sizeof(unpackiterobject), /* tp_basicsize */
1640 0, /* tp_itemsize */
1641 (destructor)unpackiter_dealloc, /* tp_dealloc */
1642 0, /* tp_print */
1643 0, /* tp_getattr */
1644 0, /* tp_setattr */
1645 0, /* tp_reserved */
1646 0, /* tp_repr */
1647 0, /* tp_as_number */
1648 0, /* tp_as_sequence */
1649 0, /* tp_as_mapping */
1650 0, /* tp_hash */
1651 0, /* tp_call */
1652 0, /* tp_str */
1653 PyObject_GenericGetAttr, /* tp_getattro */
1654 0, /* tp_setattro */
1655 0, /* tp_as_buffer */
1656 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
1657 0, /* tp_doc */
1658 (traverseproc)unpackiter_traverse, /* tp_traverse */
1659 0, /* tp_clear */
1660 0, /* tp_richcompare */
1661 0, /* tp_weaklistoffset */
1662 PyObject_SelfIter, /* tp_iter */
1663 (iternextfunc)unpackiter_iternext, /* tp_iternext */
1664 unpackiter_methods /* tp_methods */
1665};
1666
Victor Stinner3f2d1012017-02-02 12:09:30 +01001667/*[clinic input]
1668Struct.iter_unpack
1669
1670 buffer: object
1671 /
1672
1673Return an iterator yielding tuples.
1674
1675Tuples are unpacked from the given bytes source, like a repeated
1676invocation of unpack_from().
1677
1678Requires that the bytes length be a multiple of the struct size.
1679[clinic start generated code]*/
Antoine Pitrou9f146812013-04-27 00:20:04 +02001680
1681static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001682Struct_iter_unpack(PyStructObject *self, PyObject *buffer)
1683/*[clinic end generated code: output=172d83d0cd15dbab input=6d65b3f3107dbc99]*/
Antoine Pitrou9f146812013-04-27 00:20:04 +02001684{
Victor Stinner3f2d1012017-02-02 12:09:30 +01001685 unpackiterobject *iter;
Antoine Pitrou9f146812013-04-27 00:20:04 +02001686
Victor Stinner3f2d1012017-02-02 12:09:30 +01001687 assert(self->s_codes != NULL);
Antoine Pitrou9f146812013-04-27 00:20:04 +02001688
Victor Stinner3f2d1012017-02-02 12:09:30 +01001689 if (self->s_size == 0) {
Antoine Pitrou9f146812013-04-27 00:20:04 +02001690 PyErr_Format(StructError,
1691 "cannot iteratively unpack with a struct of length 0");
1692 return NULL;
1693 }
1694
Victor Stinner3f2d1012017-02-02 12:09:30 +01001695 iter = (unpackiterobject *) PyType_GenericAlloc(&unpackiter_type, 0);
1696 if (iter == NULL)
Antoine Pitrou9f146812013-04-27 00:20:04 +02001697 return NULL;
1698
Victor Stinner3f2d1012017-02-02 12:09:30 +01001699 if (PyObject_GetBuffer(buffer, &iter->buf, PyBUF_SIMPLE) < 0) {
1700 Py_DECREF(iter);
Antoine Pitrou9f146812013-04-27 00:20:04 +02001701 return NULL;
1702 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001703 if (iter->buf.len % self->s_size != 0) {
Antoine Pitrou9f146812013-04-27 00:20:04 +02001704 PyErr_Format(StructError,
1705 "iterative unpacking requires a bytes length "
1706 "multiple of %zd",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001707 self->s_size);
1708 Py_DECREF(iter);
Antoine Pitrou9f146812013-04-27 00:20:04 +02001709 return NULL;
1710 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001711 Py_INCREF(self);
1712 iter->so = self;
1713 iter->index = 0;
1714 return (PyObject *)iter;
Antoine Pitrou9f146812013-04-27 00:20:04 +02001715}
1716
1717
Thomas Wouters477c8d52006-05-27 19:21:47 +00001718/*
1719 * Guts of the pack function.
1720 *
1721 * Takes a struct object, a tuple of arguments, and offset in that tuple of
1722 * argument for where to start processing the arguments for packing, and a
1723 * character buffer for writing the packed string. The caller must insure
1724 * that the buffer may contain the required length for packing the arguments.
1725 * 0 is returned on success, 1 is returned if there is an error.
1726 *
1727 */
1728static int
Victor Stinner3f2d1012017-02-02 12:09:30 +01001729s_pack_internal(PyStructObject *soself, PyObject **args, int offset, char* buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 formatcode *code;
1732 /* XXX(nnorwitz): why does i need to be a local? can we use
1733 the offset parameter or do we need the wider width? */
1734 Py_ssize_t i;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 memset(buf, '\0', soself->s_size);
1737 i = offset;
1738 for (code = soself->s_codes; code->fmtdef != NULL; code++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 const formatdef *e = code->fmtdef;
1740 char *res = buf + code->offset;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001741 Py_ssize_t j = code->repeat;
1742 while (j--) {
Victor Stinner3f2d1012017-02-02 12:09:30 +01001743 PyObject *v = args[i++];
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001744 if (e->format == 's') {
1745 Py_ssize_t n;
1746 int isstring;
1747 void *p;
1748 isstring = PyBytes_Check(v);
1749 if (!isstring && !PyByteArray_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 PyErr_SetString(StructError,
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001751 "argument for 's' must be a bytes object");
1752 return -1;
1753 }
1754 if (isstring) {
1755 n = PyBytes_GET_SIZE(v);
1756 p = PyBytes_AS_STRING(v);
1757 }
1758 else {
1759 n = PyByteArray_GET_SIZE(v);
1760 p = PyByteArray_AS_STRING(v);
1761 }
1762 if (n > code->size)
1763 n = code->size;
1764 if (n > 0)
1765 memcpy(res, p, n);
1766 } else if (e->format == 'p') {
1767 Py_ssize_t n;
1768 int isstring;
1769 void *p;
1770 isstring = PyBytes_Check(v);
1771 if (!isstring && !PyByteArray_Check(v)) {
1772 PyErr_SetString(StructError,
1773 "argument for 'p' must be a bytes object");
1774 return -1;
1775 }
1776 if (isstring) {
1777 n = PyBytes_GET_SIZE(v);
1778 p = PyBytes_AS_STRING(v);
1779 }
1780 else {
1781 n = PyByteArray_GET_SIZE(v);
1782 p = PyByteArray_AS_STRING(v);
1783 }
1784 if (n > (code->size - 1))
1785 n = code->size - 1;
1786 if (n > 0)
1787 memcpy(res + 1, p, n);
1788 if (n > 255)
1789 n = 255;
1790 *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);
1791 } else {
1792 if (e->pack(res, v, e) < 0) {
1793 if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError))
1794 PyErr_SetString(StructError,
Serhiy Storchaka46e1ce22013-08-27 20:17:03 +03001795 "int too large to convert");
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001796 return -1;
1797 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 }
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001799 res += code->size;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 }
1801 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 /* Success */
1804 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001805}
1806
1807
1808PyDoc_STRVAR(s_pack__doc__,
Benjamin Peterson4ae19462008-07-31 15:03:40 +00001809"S.pack(v1, v2, ...) -> bytes\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00001810\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00001811Return a bytes object containing values v1, v2, ... packed according\n\
1812to the format string S.format. See help(struct) for more on format\n\
1813strings.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001814
1815static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001816s_pack(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 PyStructObject *soself;
1819 PyObject *result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 /* Validate arguments. */
1822 soself = (PyStructObject *)self;
1823 assert(PyStruct_Check(self));
1824 assert(soself->s_codes != NULL);
Victor Stinner3f2d1012017-02-02 12:09:30 +01001825 if (nargs != soself->s_len)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 {
1827 PyErr_Format(StructError,
Victor Stinner3f2d1012017-02-02 12:09:30 +01001828 "pack expected %zd items for packing (got %zd)", soself->s_len, nargs);
1829 return NULL;
1830 }
1831 if (!_PyArg_NoStackKeywords("pack", kwnames)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 return NULL;
1833 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001834
Xiang Zhang96f50282017-05-15 11:53:51 +08001835 /* Allocate a new buffer */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 result = PyBytes_FromStringAndSize((char *)NULL, soself->s_size);
1837 if (result == NULL)
1838 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 /* Call the guts */
1841 if ( s_pack_internal(soself, args, 0, PyBytes_AS_STRING(result)) != 0 ) {
1842 Py_DECREF(result);
1843 return NULL;
1844 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001847}
1848
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001849PyDoc_STRVAR(s_pack_into__doc__,
1850"S.pack_into(buffer, offset, v1, v2, ...)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00001851\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00001852Pack the values v1, v2, ... according to the format string S.format\n\
1853and write the packed bytes into the writable buffer buf starting at\n\
Mark Dickinsonfdb99f12010-06-12 16:30:53 +00001854offset. Note that the offset is a required argument. See\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00001855help(struct) for more on format strings.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001856
1857static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001858s_pack_into(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 PyStructObject *soself;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001861 Py_buffer buffer;
1862 Py_ssize_t offset;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 /* Validate arguments. +1 is for the first arg as buffer. */
1865 soself = (PyStructObject *)self;
1866 assert(PyStruct_Check(self));
1867 assert(soself->s_codes != NULL);
Victor Stinner3f2d1012017-02-02 12:09:30 +01001868 if (nargs != (soself->s_len + 2))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 {
Victor Stinner3f2d1012017-02-02 12:09:30 +01001870 if (nargs == 0) {
Petri Lehtinen92c28ca2012-10-29 21:16:57 +02001871 PyErr_Format(StructError,
1872 "pack_into expected buffer argument");
1873 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001874 else if (nargs == 1) {
Petri Lehtinen92c28ca2012-10-29 21:16:57 +02001875 PyErr_Format(StructError,
1876 "pack_into expected offset argument");
1877 }
1878 else {
1879 PyErr_Format(StructError,
1880 "pack_into expected %zd items for packing (got %zd)",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001881 soself->s_len, (nargs - 2));
Petri Lehtinen92c28ca2012-10-29 21:16:57 +02001882 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 return NULL;
1884 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001885 if (!_PyArg_NoStackKeywords("pack_into", kwnames)) {
1886 return NULL;
1887 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 /* Extract a writable memory buffer from the first argument */
Victor Stinner3f2d1012017-02-02 12:09:30 +01001890 if (!PyArg_Parse(args[0], "w*", &buffer))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 return NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001892 assert(buffer.len >= 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 /* Extract the offset from the first argument */
Victor Stinner3f2d1012017-02-02 12:09:30 +01001895 offset = PyNumber_AsSsize_t(args[1], PyExc_IndexError);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001896 if (offset == -1 && PyErr_Occurred()) {
1897 PyBuffer_Release(&buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 return NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001899 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 /* Support negative offsets. */
Andrew Nesterf78b1192017-04-04 13:46:25 +03001902 if (offset < 0) {
1903 /* Check that negative offset is low enough to fit data */
1904 if (offset + soself->s_size > 0) {
1905 PyErr_Format(StructError,
1906 "no space to pack %zd bytes at offset %zd",
1907 soself->s_size,
1908 offset);
1909 PyBuffer_Release(&buffer);
1910 return NULL;
1911 }
1912
1913 /* Check that negative offset is not crossing buffer boundary */
1914 if (offset + buffer.len < 0) {
1915 PyErr_Format(StructError,
1916 "offset %zd out of range for %zd-byte buffer",
1917 offset,
1918 buffer.len);
1919 PyBuffer_Release(&buffer);
1920 return NULL;
1921 }
1922
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001923 offset += buffer.len;
Andrew Nesterf78b1192017-04-04 13:46:25 +03001924 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 /* Check boundaries */
Andrew Nesterf78b1192017-04-04 13:46:25 +03001927 if ((buffer.len - offset) < soself->s_size) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 PyErr_Format(StructError,
Andrew Nesterf78b1192017-04-04 13:46:25 +03001929 "pack_into requires a buffer of at least %zd bytes for "
1930 "packing %zd bytes at offset %zd "
1931 "(actual buffer size is %zd)",
1932 soself->s_size + offset,
1933 soself->s_size,
1934 offset,
1935 buffer.len);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001936 PyBuffer_Release(&buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 return NULL;
1938 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 /* Call the guts */
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001941 if (s_pack_internal(soself, args, 2, (char*)buffer.buf + offset) != 0) {
1942 PyBuffer_Release(&buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 return NULL;
1944 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001945
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001946 PyBuffer_Release(&buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001948}
1949
1950static PyObject *
1951s_get_format(PyStructObject *self, void *unused)
1952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 Py_INCREF(self->s_format);
1954 return self->s_format;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001955}
1956
1957static PyObject *
1958s_get_size(PyStructObject *self, void *unused)
1959{
Christian Heimes217cfd12007-12-02 14:31:20 +00001960 return PyLong_FromSsize_t(self->s_size);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001961}
1962
Meador Ingeb14d8c92012-07-23 10:01:29 -05001963PyDoc_STRVAR(s_sizeof__doc__,
1964"S.__sizeof__() -> size of S in memory, in bytes");
1965
1966static PyObject *
Meador Inge90bc2dbc2012-07-28 22:16:39 -05001967s_sizeof(PyStructObject *self, void *unused)
Meador Ingeb14d8c92012-07-23 10:01:29 -05001968{
1969 Py_ssize_t size;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001970 formatcode *code;
Meador Ingeb14d8c92012-07-23 10:01:29 -05001971
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001972 size = _PyObject_SIZE(Py_TYPE(self)) + sizeof(formatcode);
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001973 for (code = self->s_codes; code->fmtdef != NULL; code++)
1974 size += sizeof(formatcode);
Meador Ingeb14d8c92012-07-23 10:01:29 -05001975 return PyLong_FromSsize_t(size);
1976}
1977
Thomas Wouters477c8d52006-05-27 19:21:47 +00001978/* List of functions */
1979
1980static struct PyMethodDef s_methods[] = {
Victor Stinner3f2d1012017-02-02 12:09:30 +01001981 STRUCT_ITER_UNPACK_METHODDEF
1982 {"pack", (PyCFunction)s_pack, METH_FASTCALL, s_pack__doc__},
1983 {"pack_into", (PyCFunction)s_pack_into, METH_FASTCALL, s_pack_into__doc__},
1984 STRUCT_UNPACK_METHODDEF
1985 STRUCT_UNPACK_FROM_METHODDEF
Meador Ingeb14d8c92012-07-23 10:01:29 -05001986 {"__sizeof__", (PyCFunction)s_sizeof, METH_NOARGS, s_sizeof__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 {NULL, NULL} /* sentinel */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001988};
1989
Thomas Wouters477c8d52006-05-27 19:21:47 +00001990#define OFF(x) offsetof(PyStructObject, x)
1991
1992static PyGetSetDef s_getsetlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 {"format", (getter)s_get_format, (setter)NULL, "struct format string", NULL},
1994 {"size", (getter)s_get_size, (setter)NULL, "struct size in bytes", NULL},
1995 {NULL} /* sentinel */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001996};
1997
1998static
1999PyTypeObject PyStructType = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 PyVarObject_HEAD_INIT(NULL, 0)
2001 "Struct",
2002 sizeof(PyStructObject),
2003 0,
2004 (destructor)s_dealloc, /* tp_dealloc */
2005 0, /* tp_print */
2006 0, /* tp_getattr */
2007 0, /* tp_setattr */
2008 0, /* tp_reserved */
2009 0, /* tp_repr */
2010 0, /* tp_as_number */
2011 0, /* tp_as_sequence */
2012 0, /* tp_as_mapping */
2013 0, /* tp_hash */
2014 0, /* tp_call */
2015 0, /* tp_str */
Victor Stinner3f2d1012017-02-02 12:09:30 +01002016 PyObject_GenericGetAttr, /* tp_getattro */
2017 PyObject_GenericSetAttr, /* tp_setattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 0, /* tp_as_buffer */
Victor Stinner3f2d1012017-02-02 12:09:30 +01002019 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2020 Struct___init____doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 0, /* tp_traverse */
2022 0, /* tp_clear */
2023 0, /* tp_richcompare */
2024 offsetof(PyStructObject, weakreflist), /* tp_weaklistoffset */
2025 0, /* tp_iter */
2026 0, /* tp_iternext */
Victor Stinner3f2d1012017-02-02 12:09:30 +01002027 s_methods, /* tp_methods */
2028 NULL, /* tp_members */
2029 s_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 0, /* tp_base */
2031 0, /* tp_dict */
2032 0, /* tp_descr_get */
2033 0, /* tp_descr_set */
2034 0, /* tp_dictoffset */
Victor Stinner3f2d1012017-02-02 12:09:30 +01002035 Struct___init__, /* tp_init */
2036 PyType_GenericAlloc, /* tp_alloc */
2037 s_new, /* tp_new */
2038 PyObject_Del, /* tp_free */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002039};
2040
Christian Heimesa34706f2008-01-04 03:06:10 +00002041
2042/* ---- Standalone functions ---- */
2043
2044#define MAXCACHE 100
2045static PyObject *cache = NULL;
2046
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002047static int
2048cache_struct_converter(PyObject *fmt, PyObject **ptr)
Christian Heimesa34706f2008-01-04 03:06:10 +00002049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 PyObject * s_object;
Christian Heimesa34706f2008-01-04 03:06:10 +00002051
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002052 if (fmt == NULL) {
2053 Py_DECREF(*ptr);
Serhiy Storchaka40db90c2017-04-20 21:19:31 +03002054 *ptr = NULL;
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002055 return 1;
2056 }
2057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (cache == NULL) {
2059 cache = PyDict_New();
2060 if (cache == NULL)
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002061 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 }
Christian Heimesa34706f2008-01-04 03:06:10 +00002063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 s_object = PyDict_GetItem(cache, fmt);
2065 if (s_object != NULL) {
2066 Py_INCREF(s_object);
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002067 *ptr = s_object;
2068 return Py_CLEANUP_SUPPORTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 }
Christian Heimesa34706f2008-01-04 03:06:10 +00002070
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002071 s_object = PyObject_CallFunctionObjArgs((PyObject *)(&PyStructType), fmt, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 if (s_object != NULL) {
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002073 if (PyDict_GET_SIZE(cache) >= MAXCACHE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 PyDict_Clear(cache);
2075 /* Attempt to cache the result */
2076 if (PyDict_SetItem(cache, fmt, s_object) == -1)
2077 PyErr_Clear();
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002078 *ptr = s_object;
2079 return Py_CLEANUP_SUPPORTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 }
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002081 return 0;
Christian Heimesa34706f2008-01-04 03:06:10 +00002082}
2083
Victor Stinner3f2d1012017-02-02 12:09:30 +01002084/*[clinic input]
2085_clearcache
2086
2087Clear the internal cache.
2088[clinic start generated code]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002089
2090static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002091_clearcache_impl(PyObject *module)
2092/*[clinic end generated code: output=ce4fb8a7bf7cb523 input=463eaae04bab3211]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 Py_CLEAR(cache);
2095 Py_RETURN_NONE;
Christian Heimesa34706f2008-01-04 03:06:10 +00002096}
2097
Victor Stinner3f2d1012017-02-02 12:09:30 +01002098
2099/*[clinic input]
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002100calcsize -> Py_ssize_t
Victor Stinner3f2d1012017-02-02 12:09:30 +01002101
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002102 format as s_object: cache_struct
Victor Stinner3f2d1012017-02-02 12:09:30 +01002103 /
2104
2105Return size in bytes of the struct described by the format string.
2106[clinic start generated code]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002107
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002108static Py_ssize_t
2109calcsize_impl(PyObject *module, PyStructObject *s_object)
2110/*[clinic end generated code: output=db7d23d09c6932c4 input=96a6a590c7717ecd]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002111{
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002112 return s_object->s_size;
Christian Heimesa34706f2008-01-04 03:06:10 +00002113}
2114
2115PyDoc_STRVAR(pack_doc,
Victor Stinner3f2d1012017-02-02 12:09:30 +01002116"pack(format, v1, v2, ...) -> bytes\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00002117\n\
Mark Dickinsonfdb99f12010-06-12 16:30:53 +00002118Return a bytes object containing the values v1, v2, ... packed according\n\
Victor Stinner3f2d1012017-02-02 12:09:30 +01002119to the format string. See help(struct) for more on format strings.");
Christian Heimesa34706f2008-01-04 03:06:10 +00002120
2121static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002122pack(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Christian Heimesa34706f2008-01-04 03:06:10 +00002123{
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002124 PyObject *s_object = NULL;
Victor Stinner3f2d1012017-02-02 12:09:30 +01002125 PyObject *format, *result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002126
Victor Stinner3f2d1012017-02-02 12:09:30 +01002127 if (nargs == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 PyErr_SetString(PyExc_TypeError, "missing format argument");
2129 return NULL;
2130 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01002131 format = args[0];
Christian Heimesa34706f2008-01-04 03:06:10 +00002132
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002133 if (!cache_struct_converter(format, &s_object)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 return NULL;
2135 }
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002136 result = s_pack(s_object, args + 1, nargs - 1, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 Py_DECREF(s_object);
2138 return result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002139}
2140
2141PyDoc_STRVAR(pack_into_doc,
Victor Stinner3f2d1012017-02-02 12:09:30 +01002142"pack_into(format, buffer, offset, v1, v2, ...)\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00002143\n\
Victor Stinner3f2d1012017-02-02 12:09:30 +01002144Pack the values v1, v2, ... according to the format string and write\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00002145the packed bytes into the writable buffer buf starting at offset. Note\n\
Mark Dickinsonfdb99f12010-06-12 16:30:53 +00002146that the offset is a required argument. See help(struct) for more\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00002147on format strings.");
Christian Heimesa34706f2008-01-04 03:06:10 +00002148
2149static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002150pack_into(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Christian Heimesa34706f2008-01-04 03:06:10 +00002151{
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002152 PyObject *s_object = NULL;
Victor Stinner3f2d1012017-02-02 12:09:30 +01002153 PyObject *format, *result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002154
Victor Stinner3f2d1012017-02-02 12:09:30 +01002155 if (nargs == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 PyErr_SetString(PyExc_TypeError, "missing format argument");
2157 return NULL;
2158 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01002159 format = args[0];
Christian Heimesa34706f2008-01-04 03:06:10 +00002160
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002161 if (!cache_struct_converter(format, &s_object)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 return NULL;
2163 }
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002164 result = s_pack_into(s_object, args + 1, nargs - 1, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 Py_DECREF(s_object);
2166 return result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002167}
2168
Victor Stinner3f2d1012017-02-02 12:09:30 +01002169/*[clinic input]
2170unpack
2171
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002172 format as s_object: cache_struct
Victor Stinnerc0f59ad2017-02-02 14:24:16 +01002173 buffer: Py_buffer
Victor Stinner3f2d1012017-02-02 12:09:30 +01002174 /
2175
2176Return a tuple containing values unpacked according to the format string.
2177
2178The buffer's size in bytes must be calcsize(format).
2179
2180See help(struct) for more on format strings.
2181[clinic start generated code]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002182
2183static PyObject *
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002184unpack_impl(PyObject *module, PyStructObject *s_object, Py_buffer *buffer)
2185/*[clinic end generated code: output=48ddd4d88eca8551 input=05fa3b91678da727]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002186{
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002187 return Struct_unpack_impl(s_object, buffer);
Christian Heimesa34706f2008-01-04 03:06:10 +00002188}
2189
Victor Stinner3f2d1012017-02-02 12:09:30 +01002190/*[clinic input]
2191unpack_from
2192
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002193 format as s_object: cache_struct
Victor Stinner3f2d1012017-02-02 12:09:30 +01002194 /
2195 buffer: Py_buffer
2196 offset: Py_ssize_t = 0
2197
2198Return a tuple containing values unpacked according to the format string.
2199
2200The buffer's size, minus offset, must be at least calcsize(format).
2201
2202See help(struct) for more on format strings.
2203[clinic start generated code]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002204
2205static PyObject *
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002206unpack_from_impl(PyObject *module, PyStructObject *s_object,
2207 Py_buffer *buffer, Py_ssize_t offset)
2208/*[clinic end generated code: output=1042631674c6e0d3 input=6e80a5398e985025]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002209{
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002210 return Struct_unpack_from_impl(s_object, buffer, offset);
Christian Heimesa34706f2008-01-04 03:06:10 +00002211}
2212
Victor Stinner3f2d1012017-02-02 12:09:30 +01002213/*[clinic input]
2214iter_unpack
2215
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002216 format as s_object: cache_struct
Victor Stinner3f2d1012017-02-02 12:09:30 +01002217 buffer: object
2218 /
2219
2220Return an iterator yielding tuples unpacked from the given bytes.
2221
2222The bytes are unpacked according to the format string, like
2223a repeated invocation of unpack_from().
2224
2225Requires that the bytes length be a multiple of the format struct size.
2226[clinic start generated code]*/
Antoine Pitrou9f146812013-04-27 00:20:04 +02002227
2228static PyObject *
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002229iter_unpack_impl(PyObject *module, PyStructObject *s_object,
2230 PyObject *buffer)
2231/*[clinic end generated code: output=0ae50e250d20e74d input=b214a58869a3c98d]*/
Antoine Pitrou9f146812013-04-27 00:20:04 +02002232{
Serhiy Storchakaa5a55902017-02-04 11:14:52 +02002233 return Struct_iter_unpack(s_object, buffer);
Antoine Pitrou9f146812013-04-27 00:20:04 +02002234}
2235
Christian Heimesa34706f2008-01-04 03:06:10 +00002236static struct PyMethodDef module_functions[] = {
Victor Stinner3f2d1012017-02-02 12:09:30 +01002237 _CLEARCACHE_METHODDEF
2238 CALCSIZE_METHODDEF
2239 ITER_UNPACK_METHODDEF
2240 {"pack", (PyCFunction)pack, METH_FASTCALL, pack_doc},
2241 {"pack_into", (PyCFunction)pack_into, METH_FASTCALL, pack_into_doc},
2242 UNPACK_METHODDEF
2243 UNPACK_FROM_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 {NULL, NULL} /* sentinel */
Christian Heimesa34706f2008-01-04 03:06:10 +00002245};
2246
2247
Thomas Wouters477c8d52006-05-27 19:21:47 +00002248/* Module initialization */
2249
Christian Heimesa34706f2008-01-04 03:06:10 +00002250PyDoc_STRVAR(module_doc,
2251"Functions to convert between Python values and C structs.\n\
Benjamin Peterson4ae19462008-07-31 15:03:40 +00002252Python bytes objects are used to hold the data representing the C struct\n\
Mark Dickinson40714af2009-10-08 15:59:20 +00002253and also as format strings (explained below) to describe the layout of data\n\
2254in the C struct.\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002255\n\
2256The optional first format char indicates byte order, size and alignment:\n\
Mark Dickinson40714af2009-10-08 15:59:20 +00002257 @: native order, size & alignment (default)\n\
2258 =: native order, std. size & alignment\n\
2259 <: little-endian, std. size & alignment\n\
2260 >: big-endian, std. size & alignment\n\
2261 !: same as >\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002262\n\
2263The remaining chars indicate types of args and must match exactly;\n\
2264these can be preceded by a decimal repeat count:\n\
2265 x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n\
Mark Dickinson40714af2009-10-08 15:59:20 +00002266 ?: _Bool (requires C99; if not available, char is used instead)\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002267 h:short; H:unsigned short; i:int; I:unsigned int;\n\
Mark Dickinson7c4e4092016-09-03 17:21:29 +01002268 l:long; L:unsigned long; f:float; d:double; e:half-float.\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002269Special cases (preceding decimal count indicates length):\n\
2270 s:string (array of char); p: pascal string (with count byte).\n\
Antoine Pitrou45d9c912011-10-06 15:27:40 +02002271Special cases (only available in native format):\n\
2272 n:ssize_t; N:size_t;\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002273 P:an integer type that is wide enough to hold a pointer.\n\
2274Special case (not in native mode unless 'long long' in platform C):\n\
2275 q:long long; Q:unsigned long long\n\
2276Whitespace between formats is ignored.\n\
2277\n\
2278The variable struct.error is an exception raised on errors.\n");
2279
Martin v. Löwis1a214512008-06-11 05:26:20 +00002280
2281static struct PyModuleDef _structmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 PyModuleDef_HEAD_INIT,
2283 "_struct",
2284 module_doc,
2285 -1,
2286 module_functions,
2287 NULL,
2288 NULL,
2289 NULL,
2290 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002291};
2292
Thomas Wouters477c8d52006-05-27 19:21:47 +00002293PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002294PyInit__struct(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002295{
Mark Dickinson06817852010-06-12 09:25:13 +00002296 PyObject *m;
Christian Heimesa34706f2008-01-04 03:06:10 +00002297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 m = PyModule_Create(&_structmodule);
2299 if (m == NULL)
2300 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 Py_TYPE(&PyStructType) = &PyType_Type;
2303 if (PyType_Ready(&PyStructType) < 0)
2304 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002305
Zachary Ware99f11b42016-10-04 01:20:21 -05002306 if (PyType_Ready(&unpackiter_type) < 0)
2307 return NULL;
2308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 /* Check endian and swap in faster functions */
2310 {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02002311 const formatdef *native = native_table;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 formatdef *other, *ptr;
Christian Heimes743e0cd2012-10-17 23:52:17 +02002313#if PY_LITTLE_ENDIAN
2314 other = lilendian_table;
2315#else
2316 other = bigendian_table;
2317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 /* Scan through the native table, find a matching
2319 entry in the endian table and swap in the
2320 native implementations whenever possible
2321 (64-bit platforms may not have "standard" sizes) */
2322 while (native->format != '\0' && other->format != '\0') {
2323 ptr = other;
2324 while (ptr->format != '\0') {
2325 if (ptr->format == native->format) {
2326 /* Match faster when formats are
2327 listed in the same order */
2328 if (ptr == other)
2329 other++;
2330 /* Only use the trick if the
2331 size matches */
2332 if (ptr->size != native->size)
2333 break;
2334 /* Skip float and double, could be
2335 "unknown" float format */
2336 if (ptr->format == 'd' || ptr->format == 'f')
2337 break;
2338 ptr->pack = native->pack;
2339 ptr->unpack = native->unpack;
2340 break;
2341 }
2342 ptr++;
2343 }
2344 native++;
2345 }
2346 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 /* Add some symbolic constants to the module */
2349 if (StructError == NULL) {
2350 StructError = PyErr_NewException("struct.error", NULL, NULL);
2351 if (StructError == NULL)
2352 return NULL;
2353 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 Py_INCREF(StructError);
2356 PyModule_AddObject(m, "error", StructError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 Py_INCREF((PyObject*)&PyStructType);
2359 PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 return m;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002362}