blob: 78cd0f34010b618d1258ac60fbe718e3fab50ee1 [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
Victor Stinner3f2d1012017-02-02 12:09:30 +010088#include "clinic/_struct.c.h"
89
Mark Dickinson055a3fb2010-04-03 15:26:31 +000090/* Helper for integer format codes: converts an arbitrary Python object to a
91 PyLongObject if possible, otherwise fails. Caller should decref. */
Thomas Wouters477c8d52006-05-27 19:21:47 +000092
93static PyObject *
94get_pylong(PyObject *v)
95{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 assert(v != NULL);
97 if (!PyLong_Check(v)) {
98 /* Not an integer; try to use __index__ to convert. */
99 if (PyIndex_Check(v)) {
100 v = PyNumber_Index(v);
101 if (v == NULL)
102 return NULL;
103 }
104 else {
105 PyErr_SetString(StructError,
106 "required argument is not an integer");
107 return NULL;
108 }
109 }
110 else
111 Py_INCREF(v);
Mark Dickinsonea835e72009-04-19 20:40:33 +0000112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 assert(PyLong_Check(v));
114 return v;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000115}
116
Mark Dickinsonea835e72009-04-19 20:40:33 +0000117/* Helper routine to get a C long and raise the appropriate error if it isn't
118 one */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000119
120static int
121get_long(PyObject *v, long *p)
122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 long x;
Mark Dickinsonea835e72009-04-19 20:40:33 +0000124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 v = get_pylong(v);
126 if (v == NULL)
127 return -1;
128 assert(PyLong_Check(v));
129 x = PyLong_AsLong(v);
130 Py_DECREF(v);
131 if (x == (long)-1 && PyErr_Occurred()) {
132 if (PyErr_ExceptionMatches(PyExc_OverflowError))
133 PyErr_SetString(StructError,
134 "argument out of range");
135 return -1;
136 }
137 *p = x;
138 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000139}
140
141
142/* Same, but handling unsigned long */
143
144static int
145get_ulong(PyObject *v, unsigned long *p)
146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 unsigned long x;
Mark Dickinsonea835e72009-04-19 20:40:33 +0000148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 v = get_pylong(v);
150 if (v == NULL)
151 return -1;
152 assert(PyLong_Check(v));
153 x = PyLong_AsUnsignedLong(v);
154 Py_DECREF(v);
155 if (x == (unsigned long)-1 && PyErr_Occurred()) {
156 if (PyErr_ExceptionMatches(PyExc_OverflowError))
157 PyErr_SetString(StructError,
158 "argument out of range");
159 return -1;
160 }
161 *p = x;
162 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000163}
164
Thomas Wouters477c8d52006-05-27 19:21:47 +0000165/* Same, but handling native long long. */
166
167static int
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700168get_longlong(PyObject *v, long long *p)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000169{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700170 long long x;
Mark Dickinson055a3fb2010-04-03 15:26:31 +0000171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 v = get_pylong(v);
173 if (v == NULL)
174 return -1;
175 assert(PyLong_Check(v));
176 x = PyLong_AsLongLong(v);
177 Py_DECREF(v);
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700178 if (x == (long long)-1 && PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 if (PyErr_ExceptionMatches(PyExc_OverflowError))
180 PyErr_SetString(StructError,
181 "argument out of range");
182 return -1;
183 }
184 *p = x;
185 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000186}
187
188/* Same, but handling native unsigned long long. */
189
190static int
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700191get_ulonglong(PyObject *v, unsigned long long *p)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000192{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700193 unsigned long long x;
Mark Dickinson055a3fb2010-04-03 15:26:31 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 v = get_pylong(v);
196 if (v == NULL)
197 return -1;
198 assert(PyLong_Check(v));
199 x = PyLong_AsUnsignedLongLong(v);
200 Py_DECREF(v);
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700201 if (x == (unsigned long long)-1 && PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 if (PyErr_ExceptionMatches(PyExc_OverflowError))
203 PyErr_SetString(StructError,
204 "argument out of range");
205 return -1;
206 }
207 *p = x;
208 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000209}
210
Antoine Pitrou45d9c912011-10-06 15:27:40 +0200211/* Same, but handling Py_ssize_t */
212
213static int
214get_ssize_t(PyObject *v, Py_ssize_t *p)
215{
216 Py_ssize_t x;
217
218 v = get_pylong(v);
219 if (v == NULL)
220 return -1;
221 assert(PyLong_Check(v));
222 x = PyLong_AsSsize_t(v);
223 Py_DECREF(v);
224 if (x == (Py_ssize_t)-1 && PyErr_Occurred()) {
225 if (PyErr_ExceptionMatches(PyExc_OverflowError))
226 PyErr_SetString(StructError,
227 "argument out of range");
228 return -1;
229 }
230 *p = x;
231 return 0;
232}
233
234/* Same, but handling size_t */
235
236static int
237get_size_t(PyObject *v, size_t *p)
238{
239 size_t x;
240
241 v = get_pylong(v);
242 if (v == NULL)
243 return -1;
244 assert(PyLong_Check(v));
245 x = PyLong_AsSize_t(v);
246 Py_DECREF(v);
247 if (x == (size_t)-1 && PyErr_Occurred()) {
248 if (PyErr_ExceptionMatches(PyExc_OverflowError))
249 PyErr_SetString(StructError,
250 "argument out of range");
251 return -1;
252 }
253 *p = x;
254 return 0;
255}
256
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000257
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000258#define RANGE_ERROR(x, f, flag, mask) return _range_error(f, flag)
259
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000260
Thomas Wouters477c8d52006-05-27 19:21:47 +0000261/* Floating point helpers */
262
263static PyObject *
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100264unpack_halffloat(const char *p, /* start of 2-byte string */
265 int le) /* true for little-endian, false for big-endian */
266{
267 double x;
268
269 x = _PyFloat_Unpack2((unsigned char *)p, le);
270 if (x == -1.0 && PyErr_Occurred()) {
271 return NULL;
272 }
273 return PyFloat_FromDouble(x);
274}
275
276static int
277pack_halffloat(char *p, /* start of 2-byte string */
278 PyObject *v, /* value to pack */
279 int le) /* true for little-endian, false for big-endian */
280{
281 double x = PyFloat_AsDouble(v);
282 if (x == -1.0 && PyErr_Occurred()) {
283 PyErr_SetString(StructError,
284 "required argument is not a float");
285 return -1;
286 }
287 return _PyFloat_Pack2(x, (unsigned char *)p, le);
288}
289
290static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +0000291unpack_float(const char *p, /* start of 4-byte string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 int le) /* true for little-endian, false for big-endian */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 double x;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 x = _PyFloat_Unpack4((unsigned char *)p, le);
297 if (x == -1.0 && PyErr_Occurred())
298 return NULL;
299 return PyFloat_FromDouble(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000300}
301
302static PyObject *
303unpack_double(const char *p, /* start of 8-byte string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 int le) /* true for little-endian, false for big-endian */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 double x;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 x = _PyFloat_Unpack8((unsigned char *)p, le);
309 if (x == -1.0 && PyErr_Occurred())
310 return NULL;
311 return PyFloat_FromDouble(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000312}
313
314/* Helper to format the range error exceptions */
315static int
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000316_range_error(const formatdef *f, int is_unsigned)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 /* ulargest is the largest unsigned value with f->size bytes.
319 * Note that the simpler:
320 * ((size_t)1 << (f->size * 8)) - 1
321 * doesn't work when f->size == sizeof(size_t) because C doesn't
322 * define what happens when a left shift count is >= the number of
323 * bits in the integer being shifted; e.g., on some boxes it doesn't
324 * shift at all when they're equal.
325 */
326 const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8);
327 assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T);
328 if (is_unsigned)
329 PyErr_Format(StructError,
330 "'%c' format requires 0 <= number <= %zu",
331 f->format,
332 ulargest);
333 else {
334 const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1);
335 PyErr_Format(StructError,
336 "'%c' format requires %zd <= number <= %zd",
337 f->format,
338 ~ largest,
339 largest);
340 }
Mark Dickinsonae681df2009-03-21 10:26:31 +0000341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000343}
344
345
346
347/* A large number of small routines follow, with names of the form
348
349 [bln][up]_TYPE
350
351 [bln] distiguishes among big-endian, little-endian and native.
352 [pu] distiguishes between pack (to struct) and unpack (from struct).
353 TYPE is one of char, byte, ubyte, etc.
354*/
355
356/* Native mode routines. ****************************************************/
357/* NOTE:
358 In all n[up]_<type> routines handling types larger than 1 byte, there is
359 *no* guarantee that the p pointer is properly aligned for each type,
360 therefore memcpy is called. An intermediate variable is used to
361 compensate for big-endian architectures.
362 Normally both the intermediate variable and the memcpy call will be
363 skipped by C optimisation in little-endian architectures (gcc >= 2.91
364 does this). */
365
366static PyObject *
367nu_char(const char *p, const formatdef *f)
368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 return PyBytes_FromStringAndSize(p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000370}
371
372static PyObject *
373nu_byte(const char *p, const formatdef *f)
374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 return PyLong_FromLong((long) *(signed char *)p);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000376}
377
378static PyObject *
379nu_ubyte(const char *p, const formatdef *f)
380{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 return PyLong_FromLong((long) *(unsigned char *)p);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000382}
383
384static PyObject *
385nu_short(const char *p, const formatdef *f)
386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 short x;
388 memcpy((char *)&x, p, sizeof x);
389 return PyLong_FromLong((long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000390}
391
392static PyObject *
393nu_ushort(const char *p, const formatdef *f)
394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 unsigned short x;
396 memcpy((char *)&x, p, sizeof x);
397 return PyLong_FromLong((long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000398}
399
400static PyObject *
401nu_int(const char *p, const formatdef *f)
402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 int x;
404 memcpy((char *)&x, p, sizeof x);
405 return PyLong_FromLong((long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000406}
407
408static PyObject *
409nu_uint(const char *p, const formatdef *f)
410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 unsigned int x;
412 memcpy((char *)&x, p, sizeof x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000413#if (SIZEOF_LONG > SIZEOF_INT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 return PyLong_FromLong((long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000415#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 if (x <= ((unsigned int)LONG_MAX))
417 return PyLong_FromLong((long)x);
418 return PyLong_FromUnsignedLong((unsigned long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000419#endif
420}
421
422static PyObject *
423nu_long(const char *p, const formatdef *f)
424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 long x;
426 memcpy((char *)&x, p, sizeof x);
427 return PyLong_FromLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000428}
429
430static PyObject *
431nu_ulong(const char *p, const formatdef *f)
432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 unsigned long x;
434 memcpy((char *)&x, p, sizeof x);
435 if (x <= LONG_MAX)
436 return PyLong_FromLong((long)x);
437 return PyLong_FromUnsignedLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000438}
439
Antoine Pitrou45d9c912011-10-06 15:27:40 +0200440static PyObject *
441nu_ssize_t(const char *p, const formatdef *f)
442{
443 Py_ssize_t x;
444 memcpy((char *)&x, p, sizeof x);
445 return PyLong_FromSsize_t(x);
446}
447
448static PyObject *
449nu_size_t(const char *p, const formatdef *f)
450{
451 size_t x;
452 memcpy((char *)&x, p, sizeof x);
453 return PyLong_FromSize_t(x);
454}
455
456
Thomas Wouters477c8d52006-05-27 19:21:47 +0000457/* Native mode doesn't support q or Q unless the platform C supports
458 long long (or, on Windows, __int64). */
459
Thomas Wouters477c8d52006-05-27 19:21:47 +0000460static PyObject *
461nu_longlong(const char *p, const formatdef *f)
462{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700463 long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 memcpy((char *)&x, p, sizeof x);
465 if (x >= LONG_MIN && x <= LONG_MAX)
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700466 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, long long, long));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 return PyLong_FromLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000468}
469
470static PyObject *
471nu_ulonglong(const char *p, const formatdef *f)
472{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700473 unsigned long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 memcpy((char *)&x, p, sizeof x);
475 if (x <= LONG_MAX)
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700476 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned long long, long));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 return PyLong_FromUnsignedLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000478}
479
Thomas Wouters477c8d52006-05-27 19:21:47 +0000480static PyObject *
Thomas Woutersb2137042007-02-01 18:02:27 +0000481nu_bool(const char *p, const formatdef *f)
482{
Benjamin Petersona9296e72016-09-07 11:06:17 -0700483 _Bool x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 memcpy((char *)&x, p, sizeof x);
485 return PyBool_FromLong(x != 0);
Thomas Woutersb2137042007-02-01 18:02:27 +0000486}
487
488
489static PyObject *
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100490nu_halffloat(const char *p, const formatdef *f)
491{
492#if PY_LITTLE_ENDIAN
493 return unpack_halffloat(p, 1);
494#else
495 return unpack_halffloat(p, 0);
Benjamin Petersone2e792d2016-09-19 22:17:16 -0700496#endif
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100497}
498
499static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +0000500nu_float(const char *p, const formatdef *f)
501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 float x;
503 memcpy((char *)&x, p, sizeof x);
504 return PyFloat_FromDouble((double)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000505}
506
507static PyObject *
508nu_double(const char *p, const formatdef *f)
509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 double x;
511 memcpy((char *)&x, p, sizeof x);
512 return PyFloat_FromDouble(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000513}
514
515static PyObject *
516nu_void_p(const char *p, const formatdef *f)
517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 void *x;
519 memcpy((char *)&x, p, sizeof x);
520 return PyLong_FromVoidPtr(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000521}
522
523static int
524np_byte(char *p, PyObject *v, const formatdef *f)
525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 long x;
527 if (get_long(v, &x) < 0)
528 return -1;
529 if (x < -128 || x > 127){
530 PyErr_SetString(StructError,
531 "byte format requires -128 <= number <= 127");
532 return -1;
533 }
534 *p = (char)x;
535 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000536}
537
538static int
539np_ubyte(char *p, PyObject *v, const formatdef *f)
540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 long x;
542 if (get_long(v, &x) < 0)
543 return -1;
544 if (x < 0 || x > 255){
545 PyErr_SetString(StructError,
546 "ubyte format requires 0 <= number <= 255");
547 return -1;
548 }
549 *p = (char)x;
550 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000551}
552
553static int
554np_char(char *p, PyObject *v, const formatdef *f)
555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) {
557 PyErr_SetString(StructError,
Victor Stinnerda9ec992010-12-28 13:26:42 +0000558 "char format requires a bytes object of length 1");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 return -1;
560 }
561 *p = *PyBytes_AsString(v);
562 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000563}
564
565static int
566np_short(char *p, PyObject *v, const formatdef *f)
567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 long x;
569 short y;
570 if (get_long(v, &x) < 0)
571 return -1;
572 if (x < SHRT_MIN || x > SHRT_MAX){
573 PyErr_SetString(StructError,
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200574 "short format requires " Py_STRINGIFY(SHRT_MIN)
575 " <= number <= " Py_STRINGIFY(SHRT_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 return -1;
577 }
578 y = (short)x;
579 memcpy(p, (char *)&y, sizeof y);
580 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000581}
582
583static int
584np_ushort(char *p, PyObject *v, const formatdef *f)
585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 long x;
587 unsigned short y;
588 if (get_long(v, &x) < 0)
589 return -1;
590 if (x < 0 || x > USHRT_MAX){
591 PyErr_SetString(StructError,
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200592 "ushort format requires 0 <= number <= "
593 Py_STRINGIFY(USHRT_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 return -1;
595 }
596 y = (unsigned short)x;
597 memcpy(p, (char *)&y, sizeof y);
598 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000599}
600
601static int
602np_int(char *p, PyObject *v, const formatdef *f)
603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 long x;
605 int y;
606 if (get_long(v, &x) < 0)
607 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000608#if (SIZEOF_LONG > SIZEOF_INT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))
610 RANGE_ERROR(x, f, 0, -1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 y = (int)x;
613 memcpy(p, (char *)&y, sizeof y);
614 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000615}
616
617static int
618np_uint(char *p, PyObject *v, const formatdef *f)
619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 unsigned long x;
621 unsigned int y;
622 if (get_ulong(v, &x) < 0)
623 return -1;
624 y = (unsigned int)x;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000625#if (SIZEOF_LONG > SIZEOF_INT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 if (x > ((unsigned long)UINT_MAX))
627 RANGE_ERROR(y, f, 1, -1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 memcpy(p, (char *)&y, sizeof y);
630 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000631}
632
633static int
634np_long(char *p, PyObject *v, const formatdef *f)
635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 long x;
637 if (get_long(v, &x) < 0)
638 return -1;
639 memcpy(p, (char *)&x, sizeof x);
640 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000641}
642
643static int
644np_ulong(char *p, PyObject *v, const formatdef *f)
645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 unsigned long x;
647 if (get_ulong(v, &x) < 0)
648 return -1;
649 memcpy(p, (char *)&x, sizeof x);
650 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000651}
652
Antoine Pitrou45d9c912011-10-06 15:27:40 +0200653static int
654np_ssize_t(char *p, PyObject *v, const formatdef *f)
655{
656 Py_ssize_t x;
657 if (get_ssize_t(v, &x) < 0)
658 return -1;
659 memcpy(p, (char *)&x, sizeof x);
660 return 0;
661}
662
663static int
664np_size_t(char *p, PyObject *v, const formatdef *f)
665{
666 size_t x;
667 if (get_size_t(v, &x) < 0)
668 return -1;
669 memcpy(p, (char *)&x, sizeof x);
670 return 0;
671}
672
Thomas Wouters477c8d52006-05-27 19:21:47 +0000673static int
674np_longlong(char *p, PyObject *v, const formatdef *f)
675{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700676 long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (get_longlong(v, &x) < 0)
678 return -1;
679 memcpy(p, (char *)&x, sizeof x);
680 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000681}
682
683static int
684np_ulonglong(char *p, PyObject *v, const formatdef *f)
685{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700686 unsigned long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 if (get_ulonglong(v, &x) < 0)
688 return -1;
689 memcpy(p, (char *)&x, sizeof x);
690 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000691}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000692
Thomas Woutersb2137042007-02-01 18:02:27 +0000693
694static int
695np_bool(char *p, PyObject *v, const formatdef *f)
696{
Benjamin Petersonde73c452010-07-07 18:54:59 +0000697 int y;
Benjamin Petersona9296e72016-09-07 11:06:17 -0700698 _Bool x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 y = PyObject_IsTrue(v);
Benjamin Petersonde73c452010-07-07 18:54:59 +0000700 if (y < 0)
701 return -1;
702 x = y;
703 memcpy(p, (char *)&x, sizeof x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 return 0;
Thomas Woutersb2137042007-02-01 18:02:27 +0000705}
706
Thomas Wouters477c8d52006-05-27 19:21:47 +0000707static int
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100708np_halffloat(char *p, PyObject *v, const formatdef *f)
709{
710#if PY_LITTLE_ENDIAN
711 return pack_halffloat(p, v, 1);
712#else
713 return pack_halffloat(p, v, 0);
714#endif
715}
716
717static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000718np_float(char *p, PyObject *v, const formatdef *f)
719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 float x = (float)PyFloat_AsDouble(v);
721 if (x == -1 && PyErr_Occurred()) {
722 PyErr_SetString(StructError,
723 "required argument is not a float");
724 return -1;
725 }
726 memcpy(p, (char *)&x, sizeof x);
727 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000728}
729
730static int
731np_double(char *p, PyObject *v, const formatdef *f)
732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 double x = PyFloat_AsDouble(v);
734 if (x == -1 && PyErr_Occurred()) {
735 PyErr_SetString(StructError,
736 "required argument is not a float");
737 return -1;
738 }
739 memcpy(p, (char *)&x, sizeof(double));
740 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000741}
742
743static int
744np_void_p(char *p, PyObject *v, const formatdef *f)
745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 void *x;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 v = get_pylong(v);
749 if (v == NULL)
750 return -1;
751 assert(PyLong_Check(v));
752 x = PyLong_AsVoidPtr(v);
753 Py_DECREF(v);
754 if (x == NULL && PyErr_Occurred())
755 return -1;
756 memcpy(p, (char *)&x, sizeof x);
757 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000758}
759
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200760static const formatdef native_table[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 {'x', sizeof(char), 0, NULL},
762 {'b', sizeof(char), 0, nu_byte, np_byte},
763 {'B', sizeof(char), 0, nu_ubyte, np_ubyte},
764 {'c', sizeof(char), 0, nu_char, np_char},
765 {'s', sizeof(char), 0, NULL},
766 {'p', sizeof(char), 0, NULL},
767 {'h', sizeof(short), SHORT_ALIGN, nu_short, np_short},
768 {'H', sizeof(short), SHORT_ALIGN, nu_ushort, np_ushort},
769 {'i', sizeof(int), INT_ALIGN, nu_int, np_int},
770 {'I', sizeof(int), INT_ALIGN, nu_uint, np_uint},
771 {'l', sizeof(long), LONG_ALIGN, nu_long, np_long},
772 {'L', sizeof(long), LONG_ALIGN, nu_ulong, np_ulong},
Antoine Pitrou45d9c912011-10-06 15:27:40 +0200773 {'n', sizeof(size_t), SIZE_T_ALIGN, nu_ssize_t, np_ssize_t},
774 {'N', sizeof(size_t), SIZE_T_ALIGN, nu_size_t, np_size_t},
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700775 {'q', sizeof(long long), LONG_LONG_ALIGN, nu_longlong, np_longlong},
776 {'Q', sizeof(long long), LONG_LONG_ALIGN, nu_ulonglong,np_ulonglong},
Benjamin Petersona9296e72016-09-07 11:06:17 -0700777 {'?', sizeof(_Bool), BOOL_ALIGN, nu_bool, np_bool},
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100778 {'e', sizeof(short), SHORT_ALIGN, nu_halffloat, np_halffloat},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 {'f', sizeof(float), FLOAT_ALIGN, nu_float, np_float},
780 {'d', sizeof(double), DOUBLE_ALIGN, nu_double, np_double},
781 {'P', sizeof(void *), VOID_P_ALIGN, nu_void_p, np_void_p},
782 {0}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000783};
784
785/* Big-endian routines. *****************************************************/
786
787static PyObject *
788bu_int(const char *p, const formatdef *f)
789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 long x = 0;
791 Py_ssize_t i = f->size;
792 const unsigned char *bytes = (const unsigned char *)p;
793 do {
794 x = (x<<8) | *bytes++;
795 } while (--i > 0);
796 /* Extend the sign bit. */
797 if (SIZEOF_LONG > f->size)
798 x |= -(x & (1L << ((8 * f->size) - 1)));
799 return PyLong_FromLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000800}
801
802static PyObject *
803bu_uint(const char *p, const formatdef *f)
804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 unsigned long x = 0;
806 Py_ssize_t i = f->size;
807 const unsigned char *bytes = (const unsigned char *)p;
808 do {
809 x = (x<<8) | *bytes++;
810 } while (--i > 0);
811 if (x <= LONG_MAX)
812 return PyLong_FromLong((long)x);
813 return PyLong_FromUnsignedLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000814}
815
816static PyObject *
817bu_longlong(const char *p, const formatdef *f)
818{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700819 long long x = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 Py_ssize_t i = f->size;
821 const unsigned char *bytes = (const unsigned char *)p;
822 do {
823 x = (x<<8) | *bytes++;
824 } while (--i > 0);
825 /* Extend the sign bit. */
826 if (SIZEOF_LONG_LONG > f->size)
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700827 x |= -(x & ((long long)1 << ((8 * f->size) - 1)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 if (x >= LONG_MIN && x <= LONG_MAX)
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700829 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, long long, long));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 return PyLong_FromLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000831}
832
833static PyObject *
834bu_ulonglong(const char *p, const formatdef *f)
835{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700836 unsigned long long x = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 Py_ssize_t i = f->size;
838 const unsigned char *bytes = (const unsigned char *)p;
839 do {
840 x = (x<<8) | *bytes++;
841 } while (--i > 0);
842 if (x <= LONG_MAX)
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700843 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned long long, long));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 return PyLong_FromUnsignedLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000845}
846
847static PyObject *
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100848bu_halffloat(const char *p, const formatdef *f)
849{
850 return unpack_halffloat(p, 0);
851}
852
853static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +0000854bu_float(const char *p, const formatdef *f)
855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 return unpack_float(p, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000857}
858
859static PyObject *
860bu_double(const char *p, const formatdef *f)
861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 return unpack_double(p, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000863}
864
Thomas Woutersb2137042007-02-01 18:02:27 +0000865static PyObject *
866bu_bool(const char *p, const formatdef *f)
867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 char x;
869 memcpy((char *)&x, p, sizeof x);
870 return PyBool_FromLong(x != 0);
Thomas Woutersb2137042007-02-01 18:02:27 +0000871}
872
Thomas Wouters477c8d52006-05-27 19:21:47 +0000873static int
874bp_int(char *p, PyObject *v, const formatdef *f)
875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 long x;
877 Py_ssize_t i;
878 if (get_long(v, &x) < 0)
879 return -1;
880 i = f->size;
881 if (i != SIZEOF_LONG) {
882 if ((i == 2) && (x < -32768 || x > 32767))
883 RANGE_ERROR(x, f, 0, 0xffffL);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000884#if (SIZEOF_LONG != 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 else if ((i == 4) && (x < -2147483648L || x > 2147483647L))
886 RANGE_ERROR(x, f, 0, 0xffffffffL);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 }
889 do {
890 p[--i] = (char)x;
891 x >>= 8;
892 } while (i > 0);
893 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000894}
895
896static int
897bp_uint(char *p, PyObject *v, const formatdef *f)
898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 unsigned long x;
900 Py_ssize_t i;
901 if (get_ulong(v, &x) < 0)
902 return -1;
903 i = f->size;
904 if (i != SIZEOF_LONG) {
905 unsigned long maxint = 1;
906 maxint <<= (unsigned long)(i * 8);
907 if (x >= maxint)
908 RANGE_ERROR(x, f, 1, maxint - 1);
909 }
910 do {
911 p[--i] = (char)x;
912 x >>= 8;
913 } while (i > 0);
914 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000915}
916
917static int
918bp_longlong(char *p, PyObject *v, const formatdef *f)
919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 int res;
921 v = get_pylong(v);
922 if (v == NULL)
923 return -1;
924 res = _PyLong_AsByteArray((PyLongObject *)v,
925 (unsigned char *)p,
926 8,
927 0, /* little_endian */
928 1 /* signed */);
929 Py_DECREF(v);
930 return res;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000931}
932
933static int
934bp_ulonglong(char *p, PyObject *v, const formatdef *f)
935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 int res;
937 v = get_pylong(v);
938 if (v == NULL)
939 return -1;
940 res = _PyLong_AsByteArray((PyLongObject *)v,
941 (unsigned char *)p,
942 8,
943 0, /* little_endian */
944 0 /* signed */);
945 Py_DECREF(v);
946 return res;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000947}
948
949static int
Mark Dickinson7c4e4092016-09-03 17:21:29 +0100950bp_halffloat(char *p, PyObject *v, const formatdef *f)
951{
952 return pack_halffloat(p, v, 0);
953}
954
955static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000956bp_float(char *p, PyObject *v, const formatdef *f)
957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 double x = PyFloat_AsDouble(v);
959 if (x == -1 && PyErr_Occurred()) {
960 PyErr_SetString(StructError,
961 "required argument is not a float");
962 return -1;
963 }
964 return _PyFloat_Pack4(x, (unsigned char *)p, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000965}
966
967static int
968bp_double(char *p, PyObject *v, const formatdef *f)
969{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 double x = PyFloat_AsDouble(v);
971 if (x == -1 && PyErr_Occurred()) {
972 PyErr_SetString(StructError,
973 "required argument is not a float");
974 return -1;
975 }
976 return _PyFloat_Pack8(x, (unsigned char *)p, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000977}
978
Thomas Woutersb2137042007-02-01 18:02:27 +0000979static int
980bp_bool(char *p, PyObject *v, const formatdef *f)
981{
Mark Dickinsoneff5d852010-07-18 07:29:02 +0000982 int y;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 y = PyObject_IsTrue(v);
Benjamin Petersonde73c452010-07-07 18:54:59 +0000984 if (y < 0)
985 return -1;
Mark Dickinsoneff5d852010-07-18 07:29:02 +0000986 *p = (char)y;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 return 0;
Thomas Woutersb2137042007-02-01 18:02:27 +0000988}
989
Thomas Wouters477c8d52006-05-27 19:21:47 +0000990static formatdef bigendian_table[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 {'x', 1, 0, NULL},
992 {'b', 1, 0, nu_byte, np_byte},
993 {'B', 1, 0, nu_ubyte, np_ubyte},
994 {'c', 1, 0, nu_char, np_char},
995 {'s', 1, 0, NULL},
996 {'p', 1, 0, NULL},
997 {'h', 2, 0, bu_int, bp_int},
998 {'H', 2, 0, bu_uint, bp_uint},
999 {'i', 4, 0, bu_int, bp_int},
1000 {'I', 4, 0, bu_uint, bp_uint},
1001 {'l', 4, 0, bu_int, bp_int},
1002 {'L', 4, 0, bu_uint, bp_uint},
1003 {'q', 8, 0, bu_longlong, bp_longlong},
1004 {'Q', 8, 0, bu_ulonglong, bp_ulonglong},
1005 {'?', 1, 0, bu_bool, bp_bool},
Mark Dickinson7c4e4092016-09-03 17:21:29 +01001006 {'e', 2, 0, bu_halffloat, bp_halffloat},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 {'f', 4, 0, bu_float, bp_float},
1008 {'d', 8, 0, bu_double, bp_double},
1009 {0}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001010};
1011
1012/* Little-endian routines. *****************************************************/
1013
1014static PyObject *
1015lu_int(const char *p, const formatdef *f)
1016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 long x = 0;
1018 Py_ssize_t i = f->size;
1019 const unsigned char *bytes = (const unsigned char *)p;
1020 do {
1021 x = (x<<8) | bytes[--i];
1022 } while (i > 0);
1023 /* Extend the sign bit. */
1024 if (SIZEOF_LONG > f->size)
1025 x |= -(x & (1L << ((8 * f->size) - 1)));
1026 return PyLong_FromLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001027}
1028
1029static PyObject *
1030lu_uint(const char *p, const formatdef *f)
1031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 unsigned long x = 0;
1033 Py_ssize_t i = f->size;
1034 const unsigned char *bytes = (const unsigned char *)p;
1035 do {
1036 x = (x<<8) | bytes[--i];
1037 } while (i > 0);
1038 if (x <= LONG_MAX)
1039 return PyLong_FromLong((long)x);
1040 return PyLong_FromUnsignedLong((long)x);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001041}
1042
1043static PyObject *
1044lu_longlong(const char *p, const formatdef *f)
1045{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001046 long long x = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 Py_ssize_t i = f->size;
1048 const unsigned char *bytes = (const unsigned char *)p;
1049 do {
1050 x = (x<<8) | bytes[--i];
1051 } while (i > 0);
1052 /* Extend the sign bit. */
1053 if (SIZEOF_LONG_LONG > f->size)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001054 x |= -(x & ((long long)1 << ((8 * f->size) - 1)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 if (x >= LONG_MIN && x <= LONG_MAX)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001056 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, long long, long));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 return PyLong_FromLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001058}
1059
1060static PyObject *
1061lu_ulonglong(const char *p, const formatdef *f)
1062{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001063 unsigned long long x = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 Py_ssize_t i = f->size;
1065 const unsigned char *bytes = (const unsigned char *)p;
1066 do {
1067 x = (x<<8) | bytes[--i];
1068 } while (i > 0);
1069 if (x <= LONG_MAX)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001070 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned long long, long));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 return PyLong_FromUnsignedLongLong(x);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001072}
1073
1074static PyObject *
Mark Dickinson7c4e4092016-09-03 17:21:29 +01001075lu_halffloat(const char *p, const formatdef *f)
1076{
1077 return unpack_halffloat(p, 1);
1078}
1079
1080static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081lu_float(const char *p, const formatdef *f)
1082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 return unpack_float(p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001084}
1085
1086static PyObject *
1087lu_double(const char *p, const formatdef *f)
1088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 return unpack_double(p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001090}
1091
1092static int
1093lp_int(char *p, PyObject *v, const formatdef *f)
1094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 long x;
1096 Py_ssize_t i;
1097 if (get_long(v, &x) < 0)
1098 return -1;
1099 i = f->size;
1100 if (i != SIZEOF_LONG) {
1101 if ((i == 2) && (x < -32768 || x > 32767))
1102 RANGE_ERROR(x, f, 0, 0xffffL);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001103#if (SIZEOF_LONG != 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 else if ((i == 4) && (x < -2147483648L || x > 2147483647L))
1105 RANGE_ERROR(x, f, 0, 0xffffffffL);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 }
1108 do {
1109 *p++ = (char)x;
1110 x >>= 8;
1111 } while (--i > 0);
1112 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001113}
1114
1115static int
1116lp_uint(char *p, PyObject *v, const formatdef *f)
1117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 unsigned long x;
1119 Py_ssize_t i;
1120 if (get_ulong(v, &x) < 0)
1121 return -1;
1122 i = f->size;
1123 if (i != SIZEOF_LONG) {
1124 unsigned long maxint = 1;
1125 maxint <<= (unsigned long)(i * 8);
1126 if (x >= maxint)
1127 RANGE_ERROR(x, f, 1, maxint - 1);
1128 }
1129 do {
1130 *p++ = (char)x;
1131 x >>= 8;
1132 } while (--i > 0);
1133 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001134}
1135
1136static int
1137lp_longlong(char *p, PyObject *v, const formatdef *f)
1138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 int res;
1140 v = get_pylong(v);
1141 if (v == NULL)
1142 return -1;
1143 res = _PyLong_AsByteArray((PyLongObject*)v,
1144 (unsigned char *)p,
1145 8,
1146 1, /* little_endian */
1147 1 /* signed */);
1148 Py_DECREF(v);
1149 return res;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001150}
1151
1152static int
1153lp_ulonglong(char *p, PyObject *v, const formatdef *f)
1154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 int res;
1156 v = get_pylong(v);
1157 if (v == NULL)
1158 return -1;
1159 res = _PyLong_AsByteArray((PyLongObject*)v,
1160 (unsigned char *)p,
1161 8,
1162 1, /* little_endian */
1163 0 /* signed */);
1164 Py_DECREF(v);
1165 return res;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166}
1167
1168static int
Mark Dickinson7c4e4092016-09-03 17:21:29 +01001169lp_halffloat(char *p, PyObject *v, const formatdef *f)
1170{
1171 return pack_halffloat(p, v, 1);
1172}
1173
1174static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001175lp_float(char *p, PyObject *v, const formatdef *f)
1176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 double x = PyFloat_AsDouble(v);
1178 if (x == -1 && PyErr_Occurred()) {
1179 PyErr_SetString(StructError,
1180 "required argument is not a float");
1181 return -1;
1182 }
1183 return _PyFloat_Pack4(x, (unsigned char *)p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001184}
1185
1186static int
1187lp_double(char *p, PyObject *v, const formatdef *f)
1188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 double x = PyFloat_AsDouble(v);
1190 if (x == -1 && PyErr_Occurred()) {
1191 PyErr_SetString(StructError,
1192 "required argument is not a float");
1193 return -1;
1194 }
1195 return _PyFloat_Pack8(x, (unsigned char *)p, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001196}
1197
1198static formatdef lilendian_table[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 {'x', 1, 0, NULL},
1200 {'b', 1, 0, nu_byte, np_byte},
1201 {'B', 1, 0, nu_ubyte, np_ubyte},
1202 {'c', 1, 0, nu_char, np_char},
1203 {'s', 1, 0, NULL},
1204 {'p', 1, 0, NULL},
1205 {'h', 2, 0, lu_int, lp_int},
1206 {'H', 2, 0, lu_uint, lp_uint},
1207 {'i', 4, 0, lu_int, lp_int},
1208 {'I', 4, 0, lu_uint, lp_uint},
1209 {'l', 4, 0, lu_int, lp_int},
1210 {'L', 4, 0, lu_uint, lp_uint},
1211 {'q', 8, 0, lu_longlong, lp_longlong},
1212 {'Q', 8, 0, lu_ulonglong, lp_ulonglong},
1213 {'?', 1, 0, bu_bool, bp_bool}, /* Std rep not endian dep,
1214 but potentially different from native rep -- reuse bx_bool funcs. */
Mark Dickinson7c4e4092016-09-03 17:21:29 +01001215 {'e', 2, 0, lu_halffloat, lp_halffloat},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 {'f', 4, 0, lu_float, lp_float},
1217 {'d', 8, 0, lu_double, lp_double},
1218 {0}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001219};
1220
1221
1222static const formatdef *
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001223whichtable(const char **pfmt)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 const char *fmt = (*pfmt)++; /* May be backed out of later */
1226 switch (*fmt) {
1227 case '<':
1228 return lilendian_table;
1229 case '>':
1230 case '!': /* Network byte order is big-endian */
1231 return bigendian_table;
Ezio Melotti42da6632011-03-15 05:18:48 +02001232 case '=': { /* Host byte order -- different from native in alignment! */
Christian Heimes743e0cd2012-10-17 23:52:17 +02001233#if PY_LITTLE_ENDIAN
1234 return lilendian_table;
1235#else
1236 return bigendian_table;
1237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 }
1239 default:
1240 --*pfmt; /* Back out of pointer increment */
1241 /* Fall through */
1242 case '@':
1243 return native_table;
1244 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001245}
1246
1247
1248/* Get the table entry for a format code */
1249
1250static const formatdef *
1251getentry(int c, const formatdef *f)
1252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 for (; f->format != '\0'; f++) {
1254 if (f->format == c) {
1255 return f;
1256 }
1257 }
1258 PyErr_SetString(StructError, "bad char in struct format");
1259 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001260}
1261
1262
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001263/* Align a size according to a format code. Return -1 on overflow. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001264
Mark Dickinsoneac0e682010-06-11 19:05:08 +00001265static Py_ssize_t
Thomas Wouters477c8d52006-05-27 19:21:47 +00001266align(Py_ssize_t size, char c, const formatdef *e)
1267{
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001268 Py_ssize_t extra;
1269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 if (e->format == c) {
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001271 if (e->alignment && size > 0) {
1272 extra = (e->alignment - 1) - (size - 1) % (e->alignment);
1273 if (extra > PY_SSIZE_T_MAX - size)
1274 return -1;
1275 size += extra;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 }
1277 }
1278 return size;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001279}
1280
Antoine Pitrou9f146812013-04-27 00:20:04 +02001281/*
1282 * Struct object implementation.
1283 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001284
1285/* calculate the size of a format string */
1286
1287static int
1288prepare_s(PyStructObject *self)
1289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 const formatdef *f;
1291 const formatdef *e;
1292 formatcode *codes;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 const char *s;
1295 const char *fmt;
1296 char c;
Victor Stinner706768c2014-08-16 01:03:39 +02001297 Py_ssize_t size, len, num, itemsize;
1298 size_t ncodes;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 fmt = PyBytes_AS_STRING(self->s_format);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001301
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001302 f = whichtable(&fmt);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 s = fmt;
1305 size = 0;
1306 len = 0;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001307 ncodes = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 while ((c = *s++) != '\0') {
Antoine Pitrou4de74572013-02-09 23:11:27 +01001309 if (Py_ISSPACE(Py_CHARMASK(c)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 continue;
1311 if ('0' <= c && c <= '9') {
1312 num = c - '0';
1313 while ('0' <= (c = *s++) && c <= '9') {
Mark Dickinsonab4096f2010-06-11 16:56:34 +00001314 /* overflow-safe version of
1315 if (num*10 + (c - '0') > PY_SSIZE_T_MAX) { ... } */
1316 if (num >= PY_SSIZE_T_MAX / 10 && (
1317 num > PY_SSIZE_T_MAX / 10 ||
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001318 (c - '0') > PY_SSIZE_T_MAX % 10))
1319 goto overflow;
Mark Dickinsonab4096f2010-06-11 16:56:34 +00001320 num = num*10 + (c - '0');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 }
Alexander Belopolsky177e8532010-06-11 16:04:59 +00001322 if (c == '\0') {
1323 PyErr_SetString(StructError,
1324 "repeat count given without format specifier");
1325 return -1;
1326 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 }
1328 else
1329 num = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 e = getentry(c, f);
1332 if (e == NULL)
1333 return -1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 switch (c) {
1336 case 's': /* fall through */
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001337 case 'p': len++; ncodes++; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 case 'x': break;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001339 default: len += num; if (num) ncodes++; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 itemsize = e->size;
1343 size = align(size, c, e);
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001344 if (size == -1)
1345 goto overflow;
1346
1347 /* if (size + num * itemsize > PY_SSIZE_T_MAX) { ... } */
1348 if (num > (PY_SSIZE_T_MAX - size) / itemsize)
1349 goto overflow;
1350 size += num * itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 /* check for overflow */
Victor Stinner706768c2014-08-16 01:03:39 +02001354 if ((ncodes + 1) > ((size_t)PY_SSIZE_T_MAX / sizeof(formatcode))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 PyErr_NoMemory();
1356 return -1;
1357 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +00001358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 self->s_size = size;
1360 self->s_len = len;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001361 codes = PyMem_MALLOC((ncodes + 1) * sizeof(formatcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 if (codes == NULL) {
1363 PyErr_NoMemory();
1364 return -1;
1365 }
Mark Dickinsoncf28b952010-07-29 21:41:59 +00001366 /* Free any s_codes value left over from a previous initialization. */
1367 if (self->s_codes != NULL)
1368 PyMem_FREE(self->s_codes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 self->s_codes = codes;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 s = fmt;
1372 size = 0;
1373 while ((c = *s++) != '\0') {
Antoine Pitrou4de74572013-02-09 23:11:27 +01001374 if (Py_ISSPACE(Py_CHARMASK(c)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 continue;
1376 if ('0' <= c && c <= '9') {
1377 num = c - '0';
1378 while ('0' <= (c = *s++) && c <= '9')
1379 num = num*10 + (c - '0');
1380 if (c == '\0')
1381 break;
1382 }
1383 else
1384 num = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 e = getentry(c, f);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 size = align(size, c, e);
1389 if (c == 's' || c == 'p') {
1390 codes->offset = size;
1391 codes->size = num;
1392 codes->fmtdef = e;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001393 codes->repeat = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 codes++;
1395 size += num;
1396 } else if (c == 'x') {
1397 size += num;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001398 } else if (num) {
1399 codes->offset = size;
1400 codes->size = e->size;
1401 codes->fmtdef = e;
1402 codes->repeat = num;
1403 codes++;
1404 size += e->size * num;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 }
1406 }
1407 codes->fmtdef = NULL;
1408 codes->offset = size;
1409 codes->size = 0;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001410 codes->repeat = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 return 0;
Mark Dickinsonb72e6862010-06-11 19:50:30 +00001413
1414 overflow:
1415 PyErr_SetString(StructError,
1416 "total struct size too long");
1417 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001418}
1419
1420static PyObject *
1421s_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 PyObject *self;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 assert(type != NULL && type->tp_alloc != NULL);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 self = type->tp_alloc(type, 0);
1428 if (self != NULL) {
1429 PyStructObject *s = (PyStructObject*)self;
1430 Py_INCREF(Py_None);
1431 s->s_format = Py_None;
1432 s->s_codes = NULL;
1433 s->s_size = -1;
1434 s->s_len = -1;
1435 }
1436 return self;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001437}
1438
Victor Stinner3f2d1012017-02-02 12:09:30 +01001439/*[clinic input]
1440Struct.__init__
1441
1442 format: object
1443
1444Create a compiled struct object.
1445
1446Return a new Struct object which writes and reads binary data according to
1447the format string.
1448
1449See help(struct) for more on format strings.
1450[clinic start generated code]*/
1451
Thomas Wouters477c8d52006-05-27 19:21:47 +00001452static int
Victor Stinner3f2d1012017-02-02 12:09:30 +01001453Struct___init___impl(PyStructObject *self, PyObject *format)
1454/*[clinic end generated code: output=b8e80862444e92d0 input=192a4575a3dde802]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 int ret = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001457
Victor Stinner3f2d1012017-02-02 12:09:30 +01001458 if (PyUnicode_Check(format)) {
1459 format = PyUnicode_AsASCIIString(format);
1460 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 return -1;
1462 }
1463 /* XXX support buffer interface, too */
1464 else {
Victor Stinner3f2d1012017-02-02 12:09:30 +01001465 Py_INCREF(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 }
Christian Heimesa34706f2008-01-04 03:06:10 +00001467
Victor Stinner3f2d1012017-02-02 12:09:30 +01001468 if (!PyBytes_Check(format)) {
1469 Py_DECREF(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 PyErr_Format(PyExc_TypeError,
Victor Stinnerda9ec992010-12-28 13:26:42 +00001471 "Struct() argument 1 must be a bytes object, not %.200s",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001472 Py_TYPE(format)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 return -1;
1474 }
Christian Heimesa34706f2008-01-04 03:06:10 +00001475
Victor Stinner3f2d1012017-02-02 12:09:30 +01001476 Py_XSETREF(self->s_format, format);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001477
Victor Stinner3f2d1012017-02-02 12:09:30 +01001478 ret = prepare_s(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 return ret;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001480}
1481
1482static void
1483s_dealloc(PyStructObject *s)
1484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 if (s->weakreflist != NULL)
1486 PyObject_ClearWeakRefs((PyObject *)s);
1487 if (s->s_codes != NULL) {
1488 PyMem_FREE(s->s_codes);
1489 }
1490 Py_XDECREF(s->s_format);
1491 Py_TYPE(s)->tp_free((PyObject *)s);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001492}
1493
1494static PyObject *
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001495s_unpack_internal(PyStructObject *soself, const char *startfrom) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 formatcode *code;
1497 Py_ssize_t i = 0;
1498 PyObject *result = PyTuple_New(soself->s_len);
1499 if (result == NULL)
1500 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 for (code = soself->s_codes; code->fmtdef != NULL; code++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 const formatdef *e = code->fmtdef;
1504 const char *res = startfrom + code->offset;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001505 Py_ssize_t j = code->repeat;
1506 while (j--) {
1507 PyObject *v;
1508 if (e->format == 's') {
1509 v = PyBytes_FromStringAndSize(res, code->size);
1510 } else if (e->format == 'p') {
1511 Py_ssize_t n = *(unsigned char*)res;
1512 if (n >= code->size)
1513 n = code->size - 1;
1514 v = PyBytes_FromStringAndSize(res + 1, n);
1515 } else {
1516 v = e->unpack(res, e);
1517 }
1518 if (v == NULL)
1519 goto fail;
1520 PyTuple_SET_ITEM(result, i++, v);
1521 res += code->size;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001526fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 Py_DECREF(result);
1528 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001529}
1530
1531
Victor Stinner3f2d1012017-02-02 12:09:30 +01001532/*[clinic input]
1533Struct.unpack
1534
1535 buffer: Py_buffer
1536 /
1537
1538Return a tuple containing unpacked values.
1539
1540Unpack according to the format string Struct.format. The buffer's size
1541in bytes must be Struct.size.
1542
1543See help(struct) for more on format strings.
1544[clinic start generated code]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001545
1546static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001547Struct_unpack_impl(PyStructObject *self, Py_buffer *buffer)
1548/*[clinic end generated code: output=873a24faf02e848a input=3113f8e7038b2f6c]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001549{
Victor Stinner3f2d1012017-02-02 12:09:30 +01001550 assert(self->s_codes != NULL);
1551 if (buffer->len != self->s_size) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 PyErr_Format(StructError,
Victor Stinnerda9ec992010-12-28 13:26:42 +00001553 "unpack requires a bytes object of length %zd",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001554 self->s_size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 return NULL;
1556 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001557 return s_unpack_internal(self, buffer->buf);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001558}
1559
Victor Stinner3f2d1012017-02-02 12:09:30 +01001560/*[clinic input]
1561Struct.unpack_from
1562
1563 buffer: Py_buffer
1564 offset: Py_ssize_t = 0
1565
1566Return a tuple containing unpacked values.
1567
1568Values are unpacked according to the format string Struct.format.
1569
1570The buffer's size in bytes, minus offset, must be at least Struct.size.
1571
1572See help(struct) for more on format strings.
1573[clinic start generated code]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001574
1575static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001576Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer,
1577 Py_ssize_t offset)
1578/*[clinic end generated code: output=57fac875e0977316 input=97ade52422f8962f]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001579{
Victor Stinner3f2d1012017-02-02 12:09:30 +01001580 assert(self->s_codes != NULL);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 if (offset < 0)
Victor Stinner3f2d1012017-02-02 12:09:30 +01001583 offset += buffer->len;
1584 if (offset < 0 || buffer->len - offset < self->s_size) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 PyErr_Format(StructError,
1586 "unpack_from requires a buffer of at least %zd bytes",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001587 self->s_size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 return NULL;
1589 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001590 return s_unpack_internal(self, (char*)buffer->buf + offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001591}
1592
1593
Victor Stinner3f2d1012017-02-02 12:09:30 +01001594
Antoine Pitrou9f146812013-04-27 00:20:04 +02001595/* Unpack iterator type */
1596
1597typedef struct {
1598 PyObject_HEAD
1599 PyStructObject *so;
1600 Py_buffer buf;
1601 Py_ssize_t index;
1602} unpackiterobject;
1603
1604static void
1605unpackiter_dealloc(unpackiterobject *self)
1606{
1607 Py_XDECREF(self->so);
1608 PyBuffer_Release(&self->buf);
1609 PyObject_GC_Del(self);
1610}
1611
1612static int
1613unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg)
1614{
1615 Py_VISIT(self->so);
1616 Py_VISIT(self->buf.obj);
1617 return 0;
1618}
1619
1620static PyObject *
1621unpackiter_len(unpackiterobject *self)
1622{
1623 Py_ssize_t len;
1624 if (self->so == NULL)
1625 len = 0;
1626 else
1627 len = (self->buf.len - self->index) / self->so->s_size;
1628 return PyLong_FromSsize_t(len);
1629}
1630
1631static PyMethodDef unpackiter_methods[] = {
1632 {"__length_hint__", (PyCFunction) unpackiter_len, METH_NOARGS, NULL},
1633 {NULL, NULL} /* sentinel */
1634};
1635
1636static PyObject *
1637unpackiter_iternext(unpackiterobject *self)
1638{
1639 PyObject *result;
1640 if (self->so == NULL)
1641 return NULL;
1642 if (self->index >= self->buf.len) {
1643 /* Iterator exhausted */
1644 Py_CLEAR(self->so);
1645 PyBuffer_Release(&self->buf);
1646 return NULL;
1647 }
1648 assert(self->index + self->so->s_size <= self->buf.len);
1649 result = s_unpack_internal(self->so,
1650 (char*) self->buf.buf + self->index);
1651 self->index += self->so->s_size;
1652 return result;
1653}
1654
doko@ubuntu.com46c5deb2013-11-23 16:07:55 +01001655static PyTypeObject unpackiter_type = {
Zachary Ware854adb12016-10-02 00:33:39 -05001656 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrou9f146812013-04-27 00:20:04 +02001657 "unpack_iterator", /* tp_name */
1658 sizeof(unpackiterobject), /* tp_basicsize */
1659 0, /* tp_itemsize */
1660 (destructor)unpackiter_dealloc, /* tp_dealloc */
1661 0, /* tp_print */
1662 0, /* tp_getattr */
1663 0, /* tp_setattr */
1664 0, /* tp_reserved */
1665 0, /* tp_repr */
1666 0, /* tp_as_number */
1667 0, /* tp_as_sequence */
1668 0, /* tp_as_mapping */
1669 0, /* tp_hash */
1670 0, /* tp_call */
1671 0, /* tp_str */
1672 PyObject_GenericGetAttr, /* tp_getattro */
1673 0, /* tp_setattro */
1674 0, /* tp_as_buffer */
1675 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
1676 0, /* tp_doc */
1677 (traverseproc)unpackiter_traverse, /* tp_traverse */
1678 0, /* tp_clear */
1679 0, /* tp_richcompare */
1680 0, /* tp_weaklistoffset */
1681 PyObject_SelfIter, /* tp_iter */
1682 (iternextfunc)unpackiter_iternext, /* tp_iternext */
1683 unpackiter_methods /* tp_methods */
1684};
1685
Victor Stinner3f2d1012017-02-02 12:09:30 +01001686/*[clinic input]
1687Struct.iter_unpack
1688
1689 buffer: object
1690 /
1691
1692Return an iterator yielding tuples.
1693
1694Tuples are unpacked from the given bytes source, like a repeated
1695invocation of unpack_from().
1696
1697Requires that the bytes length be a multiple of the struct size.
1698[clinic start generated code]*/
Antoine Pitrou9f146812013-04-27 00:20:04 +02001699
1700static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001701Struct_iter_unpack(PyStructObject *self, PyObject *buffer)
1702/*[clinic end generated code: output=172d83d0cd15dbab input=6d65b3f3107dbc99]*/
Antoine Pitrou9f146812013-04-27 00:20:04 +02001703{
Victor Stinner3f2d1012017-02-02 12:09:30 +01001704 unpackiterobject *iter;
Antoine Pitrou9f146812013-04-27 00:20:04 +02001705
Victor Stinner3f2d1012017-02-02 12:09:30 +01001706 assert(self->s_codes != NULL);
Antoine Pitrou9f146812013-04-27 00:20:04 +02001707
Victor Stinner3f2d1012017-02-02 12:09:30 +01001708 if (self->s_size == 0) {
Antoine Pitrou9f146812013-04-27 00:20:04 +02001709 PyErr_Format(StructError,
1710 "cannot iteratively unpack with a struct of length 0");
1711 return NULL;
1712 }
1713
Victor Stinner3f2d1012017-02-02 12:09:30 +01001714 iter = (unpackiterobject *) PyType_GenericAlloc(&unpackiter_type, 0);
1715 if (iter == NULL)
Antoine Pitrou9f146812013-04-27 00:20:04 +02001716 return NULL;
1717
Victor Stinner3f2d1012017-02-02 12:09:30 +01001718 if (PyObject_GetBuffer(buffer, &iter->buf, PyBUF_SIMPLE) < 0) {
1719 Py_DECREF(iter);
Antoine Pitrou9f146812013-04-27 00:20:04 +02001720 return NULL;
1721 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001722 if (iter->buf.len % self->s_size != 0) {
Antoine Pitrou9f146812013-04-27 00:20:04 +02001723 PyErr_Format(StructError,
1724 "iterative unpacking requires a bytes length "
1725 "multiple of %zd",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001726 self->s_size);
1727 Py_DECREF(iter);
Antoine Pitrou9f146812013-04-27 00:20:04 +02001728 return NULL;
1729 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001730 Py_INCREF(self);
1731 iter->so = self;
1732 iter->index = 0;
1733 return (PyObject *)iter;
Antoine Pitrou9f146812013-04-27 00:20:04 +02001734}
1735
1736
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737/*
1738 * Guts of the pack function.
1739 *
1740 * Takes a struct object, a tuple of arguments, and offset in that tuple of
1741 * argument for where to start processing the arguments for packing, and a
1742 * character buffer for writing the packed string. The caller must insure
1743 * that the buffer may contain the required length for packing the arguments.
1744 * 0 is returned on success, 1 is returned if there is an error.
1745 *
1746 */
1747static int
Victor Stinner3f2d1012017-02-02 12:09:30 +01001748s_pack_internal(PyStructObject *soself, PyObject **args, int offset, char* buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 formatcode *code;
1751 /* XXX(nnorwitz): why does i need to be a local? can we use
1752 the offset parameter or do we need the wider width? */
1753 Py_ssize_t i;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 memset(buf, '\0', soself->s_size);
1756 i = offset;
1757 for (code = soself->s_codes; code->fmtdef != NULL; code++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 const formatdef *e = code->fmtdef;
1759 char *res = buf + code->offset;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001760 Py_ssize_t j = code->repeat;
1761 while (j--) {
Victor Stinner3f2d1012017-02-02 12:09:30 +01001762 PyObject *v = args[i++];
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001763 if (e->format == 's') {
1764 Py_ssize_t n;
1765 int isstring;
1766 void *p;
1767 isstring = PyBytes_Check(v);
1768 if (!isstring && !PyByteArray_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 PyErr_SetString(StructError,
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001770 "argument for 's' must be a bytes object");
1771 return -1;
1772 }
1773 if (isstring) {
1774 n = PyBytes_GET_SIZE(v);
1775 p = PyBytes_AS_STRING(v);
1776 }
1777 else {
1778 n = PyByteArray_GET_SIZE(v);
1779 p = PyByteArray_AS_STRING(v);
1780 }
1781 if (n > code->size)
1782 n = code->size;
1783 if (n > 0)
1784 memcpy(res, p, n);
1785 } else if (e->format == 'p') {
1786 Py_ssize_t n;
1787 int isstring;
1788 void *p;
1789 isstring = PyBytes_Check(v);
1790 if (!isstring && !PyByteArray_Check(v)) {
1791 PyErr_SetString(StructError,
1792 "argument for 'p' must be a bytes object");
1793 return -1;
1794 }
1795 if (isstring) {
1796 n = PyBytes_GET_SIZE(v);
1797 p = PyBytes_AS_STRING(v);
1798 }
1799 else {
1800 n = PyByteArray_GET_SIZE(v);
1801 p = PyByteArray_AS_STRING(v);
1802 }
1803 if (n > (code->size - 1))
1804 n = code->size - 1;
1805 if (n > 0)
1806 memcpy(res + 1, p, n);
1807 if (n > 255)
1808 n = 255;
1809 *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);
1810 } else {
1811 if (e->pack(res, v, e) < 0) {
1812 if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError))
1813 PyErr_SetString(StructError,
Serhiy Storchaka46e1ce22013-08-27 20:17:03 +03001814 "int too large to convert");
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001815 return -1;
1816 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 }
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001818 res += code->size;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 }
1820 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 /* Success */
1823 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001824}
1825
1826
1827PyDoc_STRVAR(s_pack__doc__,
Benjamin Peterson4ae19462008-07-31 15:03:40 +00001828"S.pack(v1, v2, ...) -> bytes\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00001829\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00001830Return a bytes object containing values v1, v2, ... packed according\n\
1831to the format string S.format. See help(struct) for more on format\n\
1832strings.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001833
1834static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001835s_pack(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 PyStructObject *soself;
1838 PyObject *result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 /* Validate arguments. */
1841 soself = (PyStructObject *)self;
1842 assert(PyStruct_Check(self));
1843 assert(soself->s_codes != NULL);
Victor Stinner3f2d1012017-02-02 12:09:30 +01001844 if (nargs != soself->s_len)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 {
1846 PyErr_Format(StructError,
Victor Stinner3f2d1012017-02-02 12:09:30 +01001847 "pack expected %zd items for packing (got %zd)", soself->s_len, nargs);
1848 return NULL;
1849 }
1850 if (!_PyArg_NoStackKeywords("pack", kwnames)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 return NULL;
1852 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 /* Allocate a new string */
1855 result = PyBytes_FromStringAndSize((char *)NULL, soself->s_size);
1856 if (result == NULL)
1857 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 /* Call the guts */
1860 if ( s_pack_internal(soself, args, 0, PyBytes_AS_STRING(result)) != 0 ) {
1861 Py_DECREF(result);
1862 return NULL;
1863 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001866}
1867
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001868PyDoc_STRVAR(s_pack_into__doc__,
1869"S.pack_into(buffer, offset, v1, v2, ...)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00001870\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00001871Pack the values v1, v2, ... according to the format string S.format\n\
1872and write the packed bytes into the writable buffer buf starting at\n\
Mark Dickinsonfdb99f12010-06-12 16:30:53 +00001873offset. Note that the offset is a required argument. See\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00001874help(struct) for more on format strings.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001875
1876static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01001877s_pack_into(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 PyStructObject *soself;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001880 Py_buffer buffer;
1881 Py_ssize_t offset;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 /* Validate arguments. +1 is for the first arg as buffer. */
1884 soself = (PyStructObject *)self;
1885 assert(PyStruct_Check(self));
1886 assert(soself->s_codes != NULL);
Victor Stinner3f2d1012017-02-02 12:09:30 +01001887 if (nargs != (soself->s_len + 2))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 {
Victor Stinner3f2d1012017-02-02 12:09:30 +01001889 if (nargs == 0) {
Petri Lehtinen92c28ca2012-10-29 21:16:57 +02001890 PyErr_Format(StructError,
1891 "pack_into expected buffer argument");
1892 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001893 else if (nargs == 1) {
Petri Lehtinen92c28ca2012-10-29 21:16:57 +02001894 PyErr_Format(StructError,
1895 "pack_into expected offset argument");
1896 }
1897 else {
1898 PyErr_Format(StructError,
1899 "pack_into expected %zd items for packing (got %zd)",
Victor Stinner3f2d1012017-02-02 12:09:30 +01001900 soself->s_len, (nargs - 2));
Petri Lehtinen92c28ca2012-10-29 21:16:57 +02001901 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 return NULL;
1903 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01001904 if (!_PyArg_NoStackKeywords("pack_into", kwnames)) {
1905 return NULL;
1906 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 /* Extract a writable memory buffer from the first argument */
Victor Stinner3f2d1012017-02-02 12:09:30 +01001909 if (!PyArg_Parse(args[0], "w*", &buffer))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 return NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001911 assert(buffer.len >= 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 /* Extract the offset from the first argument */
Victor Stinner3f2d1012017-02-02 12:09:30 +01001914 offset = PyNumber_AsSsize_t(args[1], PyExc_IndexError);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001915 if (offset == -1 && PyErr_Occurred()) {
1916 PyBuffer_Release(&buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 return NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001918 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 /* Support negative offsets. */
1921 if (offset < 0)
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001922 offset += buffer.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 /* Check boundaries */
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001925 if (offset < 0 || (buffer.len - offset) < soself->s_size) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 PyErr_Format(StructError,
1927 "pack_into requires a buffer of at least %zd bytes",
1928 soself->s_size);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001929 PyBuffer_Release(&buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 return NULL;
1931 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 /* Call the guts */
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001934 if (s_pack_internal(soself, args, 2, (char*)buffer.buf + offset) != 0) {
1935 PyBuffer_Release(&buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 return NULL;
1937 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001938
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001939 PyBuffer_Release(&buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001941}
1942
1943static PyObject *
1944s_get_format(PyStructObject *self, void *unused)
1945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 Py_INCREF(self->s_format);
1947 return self->s_format;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001948}
1949
1950static PyObject *
1951s_get_size(PyStructObject *self, void *unused)
1952{
Christian Heimes217cfd12007-12-02 14:31:20 +00001953 return PyLong_FromSsize_t(self->s_size);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001954}
1955
Meador Ingeb14d8c92012-07-23 10:01:29 -05001956PyDoc_STRVAR(s_sizeof__doc__,
1957"S.__sizeof__() -> size of S in memory, in bytes");
1958
1959static PyObject *
Meador Inge90bc2dbc2012-07-28 22:16:39 -05001960s_sizeof(PyStructObject *self, void *unused)
Meador Ingeb14d8c92012-07-23 10:01:29 -05001961{
1962 Py_ssize_t size;
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001963 formatcode *code;
Meador Ingeb14d8c92012-07-23 10:01:29 -05001964
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001965 size = _PyObject_SIZE(Py_TYPE(self)) + sizeof(formatcode);
Serhiy Storchakafff61f22013-05-17 10:49:44 +03001966 for (code = self->s_codes; code->fmtdef != NULL; code++)
1967 size += sizeof(formatcode);
Meador Ingeb14d8c92012-07-23 10:01:29 -05001968 return PyLong_FromSsize_t(size);
1969}
1970
Thomas Wouters477c8d52006-05-27 19:21:47 +00001971/* List of functions */
1972
1973static struct PyMethodDef s_methods[] = {
Victor Stinner3f2d1012017-02-02 12:09:30 +01001974 STRUCT_ITER_UNPACK_METHODDEF
1975 {"pack", (PyCFunction)s_pack, METH_FASTCALL, s_pack__doc__},
1976 {"pack_into", (PyCFunction)s_pack_into, METH_FASTCALL, s_pack_into__doc__},
1977 STRUCT_UNPACK_METHODDEF
1978 STRUCT_UNPACK_FROM_METHODDEF
Meador Ingeb14d8c92012-07-23 10:01:29 -05001979 {"__sizeof__", (PyCFunction)s_sizeof, METH_NOARGS, s_sizeof__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 {NULL, NULL} /* sentinel */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001981};
1982
Thomas Wouters477c8d52006-05-27 19:21:47 +00001983#define OFF(x) offsetof(PyStructObject, x)
1984
1985static PyGetSetDef s_getsetlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 {"format", (getter)s_get_format, (setter)NULL, "struct format string", NULL},
1987 {"size", (getter)s_get_size, (setter)NULL, "struct size in bytes", NULL},
1988 {NULL} /* sentinel */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001989};
1990
1991static
1992PyTypeObject PyStructType = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 PyVarObject_HEAD_INIT(NULL, 0)
1994 "Struct",
1995 sizeof(PyStructObject),
1996 0,
1997 (destructor)s_dealloc, /* tp_dealloc */
1998 0, /* tp_print */
1999 0, /* tp_getattr */
2000 0, /* tp_setattr */
2001 0, /* tp_reserved */
2002 0, /* tp_repr */
2003 0, /* tp_as_number */
2004 0, /* tp_as_sequence */
2005 0, /* tp_as_mapping */
2006 0, /* tp_hash */
2007 0, /* tp_call */
2008 0, /* tp_str */
Victor Stinner3f2d1012017-02-02 12:09:30 +01002009 PyObject_GenericGetAttr, /* tp_getattro */
2010 PyObject_GenericSetAttr, /* tp_setattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 0, /* tp_as_buffer */
Victor Stinner3f2d1012017-02-02 12:09:30 +01002012 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2013 Struct___init____doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 0, /* tp_traverse */
2015 0, /* tp_clear */
2016 0, /* tp_richcompare */
2017 offsetof(PyStructObject, weakreflist), /* tp_weaklistoffset */
2018 0, /* tp_iter */
2019 0, /* tp_iternext */
Victor Stinner3f2d1012017-02-02 12:09:30 +01002020 s_methods, /* tp_methods */
2021 NULL, /* tp_members */
2022 s_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 0, /* tp_base */
2024 0, /* tp_dict */
2025 0, /* tp_descr_get */
2026 0, /* tp_descr_set */
2027 0, /* tp_dictoffset */
Victor Stinner3f2d1012017-02-02 12:09:30 +01002028 Struct___init__, /* tp_init */
2029 PyType_GenericAlloc, /* tp_alloc */
2030 s_new, /* tp_new */
2031 PyObject_Del, /* tp_free */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002032};
2033
Christian Heimesa34706f2008-01-04 03:06:10 +00002034
2035/* ---- Standalone functions ---- */
2036
2037#define MAXCACHE 100
2038static PyObject *cache = NULL;
2039
Victor Stinner3f2d1012017-02-02 12:09:30 +01002040static PyStructObject *
Christian Heimesa34706f2008-01-04 03:06:10 +00002041cache_struct(PyObject *fmt)
2042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 PyObject * s_object;
Christian Heimesa34706f2008-01-04 03:06:10 +00002044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 if (cache == NULL) {
2046 cache = PyDict_New();
2047 if (cache == NULL)
2048 return NULL;
2049 }
Christian Heimesa34706f2008-01-04 03:06:10 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 s_object = PyDict_GetItem(cache, fmt);
2052 if (s_object != NULL) {
2053 Py_INCREF(s_object);
Victor Stinner3f2d1012017-02-02 12:09:30 +01002054 return (PyStructObject *)s_object;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 }
Christian Heimesa34706f2008-01-04 03:06:10 +00002056
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002057 s_object = PyObject_CallFunctionObjArgs((PyObject *)(&PyStructType), fmt, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (s_object != NULL) {
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002059 if (PyDict_GET_SIZE(cache) >= MAXCACHE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 PyDict_Clear(cache);
2061 /* Attempt to cache the result */
2062 if (PyDict_SetItem(cache, fmt, s_object) == -1)
2063 PyErr_Clear();
2064 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01002065 return (PyStructObject *)s_object;
Christian Heimesa34706f2008-01-04 03:06:10 +00002066}
2067
Victor Stinner3f2d1012017-02-02 12:09:30 +01002068/*[clinic input]
2069_clearcache
2070
2071Clear the internal cache.
2072[clinic start generated code]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002073
2074static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002075_clearcache_impl(PyObject *module)
2076/*[clinic end generated code: output=ce4fb8a7bf7cb523 input=463eaae04bab3211]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 Py_CLEAR(cache);
2079 Py_RETURN_NONE;
Christian Heimesa34706f2008-01-04 03:06:10 +00002080}
2081
Victor Stinner3f2d1012017-02-02 12:09:30 +01002082
2083/*[clinic input]
2084calcsize
2085
2086 format: object
2087 /
2088
2089Return size in bytes of the struct described by the format string.
2090[clinic start generated code]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002091
2092static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002093calcsize(PyObject *module, PyObject *format)
2094/*[clinic end generated code: output=90fbcf191fe9470a input=55488303a06777fa]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 Py_ssize_t n;
Victor Stinner3f2d1012017-02-02 12:09:30 +01002097 PyStructObject *s_object = cache_struct(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 if (s_object == NULL)
2099 return NULL;
Victor Stinner3f2d1012017-02-02 12:09:30 +01002100 n = s_object->s_size;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 Py_DECREF(s_object);
2102 return PyLong_FromSsize_t(n);
Christian Heimesa34706f2008-01-04 03:06:10 +00002103}
2104
2105PyDoc_STRVAR(pack_doc,
Victor Stinner3f2d1012017-02-02 12:09:30 +01002106"pack(format, v1, v2, ...) -> bytes\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00002107\n\
Mark Dickinsonfdb99f12010-06-12 16:30:53 +00002108Return a bytes object containing the values v1, v2, ... packed according\n\
Victor Stinner3f2d1012017-02-02 12:09:30 +01002109to the format string. See help(struct) for more on format strings.");
Christian Heimesa34706f2008-01-04 03:06:10 +00002110
2111static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002112pack(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Christian Heimesa34706f2008-01-04 03:06:10 +00002113{
Victor Stinner3f2d1012017-02-02 12:09:30 +01002114 PyStructObject *s_object;
2115 PyObject *format, *result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002116
Victor Stinner3f2d1012017-02-02 12:09:30 +01002117 if (nargs == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 PyErr_SetString(PyExc_TypeError, "missing format argument");
2119 return NULL;
2120 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01002121 format = args[0];
Christian Heimesa34706f2008-01-04 03:06:10 +00002122
Victor Stinner3f2d1012017-02-02 12:09:30 +01002123 s_object = cache_struct(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 if (s_object == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 return NULL;
2126 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01002127 result = s_pack((PyObject *)s_object, args + 1, nargs - 1, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 Py_DECREF(s_object);
2129 return result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002130}
2131
2132PyDoc_STRVAR(pack_into_doc,
Victor Stinner3f2d1012017-02-02 12:09:30 +01002133"pack_into(format, buffer, offset, v1, v2, ...)\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00002134\n\
Victor Stinner3f2d1012017-02-02 12:09:30 +01002135Pack the values v1, v2, ... according to the format string and write\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00002136the packed bytes into the writable buffer buf starting at offset. Note\n\
Mark Dickinsonfdb99f12010-06-12 16:30:53 +00002137that the offset is a required argument. See help(struct) for more\n\
Mark Dickinsonaacfa952010-06-12 15:43:45 +00002138on format strings.");
Christian Heimesa34706f2008-01-04 03:06:10 +00002139
2140static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002141pack_into(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Christian Heimesa34706f2008-01-04 03:06:10 +00002142{
Victor Stinner3f2d1012017-02-02 12:09:30 +01002143 PyStructObject *s_object;
2144 PyObject *format, *result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002145
Victor Stinner3f2d1012017-02-02 12:09:30 +01002146 if (nargs == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 PyErr_SetString(PyExc_TypeError, "missing format argument");
2148 return NULL;
2149 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01002150 format = args[0];
Christian Heimesa34706f2008-01-04 03:06:10 +00002151
Victor Stinner3f2d1012017-02-02 12:09:30 +01002152 s_object = cache_struct(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 if (s_object == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 return NULL;
2155 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01002156 result = s_pack_into((PyObject *)s_object, args + 1, nargs - 1, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 Py_DECREF(s_object);
2158 return result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002159}
2160
Victor Stinner3f2d1012017-02-02 12:09:30 +01002161/*[clinic input]
2162unpack
2163
2164 format: object
Victor Stinnerc0f59ad2017-02-02 14:24:16 +01002165 buffer: Py_buffer
Victor Stinner3f2d1012017-02-02 12:09:30 +01002166 /
2167
2168Return a tuple containing values unpacked according to the format string.
2169
2170The buffer's size in bytes must be calcsize(format).
2171
2172See help(struct) for more on format strings.
2173[clinic start generated code]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002174
2175static PyObject *
Victor Stinnerc0f59ad2017-02-02 14:24:16 +01002176unpack_impl(PyObject *module, PyObject *format, Py_buffer *buffer)
2177/*[clinic end generated code: output=f75ada02aaa33b3b input=654078e6660c2df0]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002178{
Victor Stinner3f2d1012017-02-02 12:09:30 +01002179 PyStructObject *s_object;
2180 PyObject *result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002181
Victor Stinner3f2d1012017-02-02 12:09:30 +01002182 s_object = cache_struct(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 if (s_object == NULL)
2184 return NULL;
Victor Stinnerc0f59ad2017-02-02 14:24:16 +01002185 result = Struct_unpack_impl(s_object, buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 Py_DECREF(s_object);
2187 return result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002188}
2189
Victor Stinner3f2d1012017-02-02 12:09:30 +01002190/*[clinic input]
2191unpack_from
2192
2193 format: object
2194 /
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 *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002206unpack_from_impl(PyObject *module, PyObject *format, Py_buffer *buffer,
2207 Py_ssize_t offset)
2208/*[clinic end generated code: output=2492f0c3a0b82577 input=9ead76c6ac7164f7]*/
Christian Heimesa34706f2008-01-04 03:06:10 +00002209{
Victor Stinner3f2d1012017-02-02 12:09:30 +01002210 PyStructObject *s_object;
2211 PyObject *result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002212
Victor Stinner3f2d1012017-02-02 12:09:30 +01002213 s_object = cache_struct(format);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 if (s_object == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 return NULL;
2216 }
Victor Stinner3f2d1012017-02-02 12:09:30 +01002217 result = Struct_unpack_from_impl(s_object, buffer, offset);
2218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 Py_DECREF(s_object);
2220 return result;
Christian Heimesa34706f2008-01-04 03:06:10 +00002221}
2222
Victor Stinner3f2d1012017-02-02 12:09:30 +01002223/*[clinic input]
2224iter_unpack
2225
2226 format: object
2227 buffer: object
2228 /
2229
2230Return an iterator yielding tuples unpacked from the given bytes.
2231
2232The bytes are unpacked according to the format string, like
2233a repeated invocation of unpack_from().
2234
2235Requires that the bytes length be a multiple of the format struct size.
2236[clinic start generated code]*/
Antoine Pitrou9f146812013-04-27 00:20:04 +02002237
2238static PyObject *
Victor Stinner3f2d1012017-02-02 12:09:30 +01002239iter_unpack_impl(PyObject *module, PyObject *format, PyObject *buffer)
2240/*[clinic end generated code: output=b1291e97a6d4cf3c input=8674dfd2f0dae416]*/
Antoine Pitrou9f146812013-04-27 00:20:04 +02002241{
Victor Stinner3f2d1012017-02-02 12:09:30 +01002242 PyStructObject *s_object;
2243 PyObject *result;
Antoine Pitrou9f146812013-04-27 00:20:04 +02002244
Victor Stinner3f2d1012017-02-02 12:09:30 +01002245 s_object = cache_struct(format);
Antoine Pitrou9f146812013-04-27 00:20:04 +02002246 if (s_object == NULL)
2247 return NULL;
Victor Stinner3f2d1012017-02-02 12:09:30 +01002248
2249 result = Struct_iter_unpack(s_object, buffer);
Antoine Pitrou9f146812013-04-27 00:20:04 +02002250 Py_DECREF(s_object);
2251 return result;
2252}
2253
Christian Heimesa34706f2008-01-04 03:06:10 +00002254static struct PyMethodDef module_functions[] = {
Victor Stinner3f2d1012017-02-02 12:09:30 +01002255 _CLEARCACHE_METHODDEF
2256 CALCSIZE_METHODDEF
2257 ITER_UNPACK_METHODDEF
2258 {"pack", (PyCFunction)pack, METH_FASTCALL, pack_doc},
2259 {"pack_into", (PyCFunction)pack_into, METH_FASTCALL, pack_into_doc},
2260 UNPACK_METHODDEF
2261 UNPACK_FROM_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 {NULL, NULL} /* sentinel */
Christian Heimesa34706f2008-01-04 03:06:10 +00002263};
2264
2265
Thomas Wouters477c8d52006-05-27 19:21:47 +00002266/* Module initialization */
2267
Christian Heimesa34706f2008-01-04 03:06:10 +00002268PyDoc_STRVAR(module_doc,
2269"Functions to convert between Python values and C structs.\n\
Benjamin Peterson4ae19462008-07-31 15:03:40 +00002270Python bytes objects are used to hold the data representing the C struct\n\
Mark Dickinson40714af2009-10-08 15:59:20 +00002271and also as format strings (explained below) to describe the layout of data\n\
2272in the C struct.\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002273\n\
2274The optional first format char indicates byte order, size and alignment:\n\
Mark Dickinson40714af2009-10-08 15:59:20 +00002275 @: native order, size & alignment (default)\n\
2276 =: native order, std. size & alignment\n\
2277 <: little-endian, std. size & alignment\n\
2278 >: big-endian, std. size & alignment\n\
2279 !: same as >\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002280\n\
2281The remaining chars indicate types of args and must match exactly;\n\
2282these can be preceded by a decimal repeat count:\n\
2283 x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n\
Mark Dickinson40714af2009-10-08 15:59:20 +00002284 ?: _Bool (requires C99; if not available, char is used instead)\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002285 h:short; H:unsigned short; i:int; I:unsigned int;\n\
Mark Dickinson7c4e4092016-09-03 17:21:29 +01002286 l:long; L:unsigned long; f:float; d:double; e:half-float.\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002287Special cases (preceding decimal count indicates length):\n\
2288 s:string (array of char); p: pascal string (with count byte).\n\
Antoine Pitrou45d9c912011-10-06 15:27:40 +02002289Special cases (only available in native format):\n\
2290 n:ssize_t; N:size_t;\n\
Christian Heimesa34706f2008-01-04 03:06:10 +00002291 P:an integer type that is wide enough to hold a pointer.\n\
2292Special case (not in native mode unless 'long long' in platform C):\n\
2293 q:long long; Q:unsigned long long\n\
2294Whitespace between formats is ignored.\n\
2295\n\
2296The variable struct.error is an exception raised on errors.\n");
2297
Martin v. Löwis1a214512008-06-11 05:26:20 +00002298
2299static struct PyModuleDef _structmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 PyModuleDef_HEAD_INIT,
2301 "_struct",
2302 module_doc,
2303 -1,
2304 module_functions,
2305 NULL,
2306 NULL,
2307 NULL,
2308 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002309};
2310
Thomas Wouters477c8d52006-05-27 19:21:47 +00002311PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002312PyInit__struct(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002313{
Mark Dickinson06817852010-06-12 09:25:13 +00002314 PyObject *m;
Christian Heimesa34706f2008-01-04 03:06:10 +00002315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 m = PyModule_Create(&_structmodule);
2317 if (m == NULL)
2318 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 Py_TYPE(&PyStructType) = &PyType_Type;
2321 if (PyType_Ready(&PyStructType) < 0)
2322 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002323
Zachary Ware99f11b42016-10-04 01:20:21 -05002324 if (PyType_Ready(&unpackiter_type) < 0)
2325 return NULL;
2326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 /* Check endian and swap in faster functions */
2328 {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02002329 const formatdef *native = native_table;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 formatdef *other, *ptr;
Christian Heimes743e0cd2012-10-17 23:52:17 +02002331#if PY_LITTLE_ENDIAN
2332 other = lilendian_table;
2333#else
2334 other = bigendian_table;
2335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 /* Scan through the native table, find a matching
2337 entry in the endian table and swap in the
2338 native implementations whenever possible
2339 (64-bit platforms may not have "standard" sizes) */
2340 while (native->format != '\0' && other->format != '\0') {
2341 ptr = other;
2342 while (ptr->format != '\0') {
2343 if (ptr->format == native->format) {
2344 /* Match faster when formats are
2345 listed in the same order */
2346 if (ptr == other)
2347 other++;
2348 /* Only use the trick if the
2349 size matches */
2350 if (ptr->size != native->size)
2351 break;
2352 /* Skip float and double, could be
2353 "unknown" float format */
2354 if (ptr->format == 'd' || ptr->format == 'f')
2355 break;
2356 ptr->pack = native->pack;
2357 ptr->unpack = native->unpack;
2358 break;
2359 }
2360 ptr++;
2361 }
2362 native++;
2363 }
2364 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 /* Add some symbolic constants to the module */
2367 if (StructError == NULL) {
2368 StructError = PyErr_NewException("struct.error", NULL, NULL);
2369 if (StructError == NULL)
2370 return NULL;
2371 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 Py_INCREF(StructError);
2374 PyModule_AddObject(m, "error", StructError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 Py_INCREF((PyObject*)&PyStructType);
2377 PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 return m;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002380}