1 /* struct module -- pack values into and (out of) strings */
3 /* New version supporting byte order, alignment and size options,
4 character strings, and unsigned numbers */
9 PyDoc_STRVAR(struct__doc__
,
10 "Functions to convert between Python values and C structs.\n\
11 Python strings are used to hold the data representing the C struct\n\
12 and also as format strings to describe the layout of data in the C struct.\n\
14 The optional first format char indicates byte order, size and alignment:\n\
15 @: native order, size & alignment (default)\n\
16 =: native order, std. size & alignment\n\
17 <: little-endian, std. size & alignment\n\
18 >: big-endian, std. size & alignment\n\
21 The remaining chars indicate types of args and must match exactly;\n\
22 these can be preceded by a decimal repeat count:\n\
23 x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n\
24 h:short; H:unsigned short; i:int; I:unsigned int;\n\
25 l:long; L:unsigned long; f:float; d:double.\n\
26 Special cases (preceding decimal count indicates length):\n\
27 s:string (array of char); p: pascal string (with count byte).\n\
28 Special case (only available in native format):\n\
29 P:an integer type that is wide enough to hold a pointer.\n\
30 Special case (not in native mode unless 'long long' in platform C):\n\
31 q:long long; Q:unsigned long long\n\
32 Whitespace between formats is ignored.\n\
34 The variable struct.error is an exception raised on errors.");
39 static PyObject
*StructError
;
42 /* Define various structs to figure out the alignments of types */
45 typedef struct { char c
; short x
; } st_short
;
46 typedef struct { char c
; int x
; } st_int
;
47 typedef struct { char c
; long x
; } st_long
;
48 typedef struct { char c
; float x
; } st_float
;
49 typedef struct { char c
; double x
; } st_double
;
50 typedef struct { char c
; void *x
; } st_void_p
;
52 #define SHORT_ALIGN (sizeof(st_short) - sizeof(short))
53 #define INT_ALIGN (sizeof(st_int) - sizeof(int))
54 #define LONG_ALIGN (sizeof(st_long) - sizeof(long))
55 #define FLOAT_ALIGN (sizeof(st_float) - sizeof(float))
56 #define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double))
57 #define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *))
59 /* We can't support q and Q in native mode unless the compiler does;
60 in std mode, they're 8 bytes on all platforms. */
62 typedef struct { char c
; PY_LONG_LONG x
; } s_long_long
;
63 #define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(PY_LONG_LONG))
66 #define STRINGIFY(x) #x
69 #pragma options align=reset
72 /* Helper to get a PyLongObject by hook or by crook. Caller should decref. */
75 get_pylong(PyObject
*v
)
81 return PyLong_FromLong(PyInt_AS_LONG(v
));
82 if (PyLong_Check(v
)) {
86 m
= v
->ob_type
->tp_as_number
;
87 if (m
!= NULL
&& m
->nb_long
!= NULL
) {
95 PyErr_SetString(StructError
,
96 "cannot convert argument to long");
100 /* Helper routine to get a Python integer and raise the appropriate error
104 get_long(PyObject
*v
, long *p
)
106 long x
= PyInt_AsLong(v
);
107 if (x
== -1 && PyErr_Occurred()) {
108 if (PyErr_ExceptionMatches(PyExc_TypeError
))
109 PyErr_SetString(StructError
,
110 "required argument is not an integer");
118 /* Same, but handling unsigned long */
121 get_ulong(PyObject
*v
, unsigned long *p
)
123 if (PyLong_Check(v
)) {
124 unsigned long x
= PyLong_AsUnsignedLong(v
);
125 if (x
== (unsigned long)(-1) && PyErr_Occurred())
131 return get_long(v
, (long *)p
);
135 #ifdef HAVE_LONG_LONG
137 /* Same, but handling native long long. */
140 get_longlong(PyObject
*v
, PY_LONG_LONG
*p
)
147 assert(PyLong_Check(v
));
148 x
= PyLong_AsLongLong(v
);
150 if (x
== (PY_LONG_LONG
)-1 && PyErr_Occurred())
156 /* Same, but handling native unsigned long long. */
159 get_ulonglong(PyObject
*v
, unsigned PY_LONG_LONG
*p
)
161 unsigned PY_LONG_LONG x
;
166 assert(PyLong_Check(v
));
167 x
= PyLong_AsUnsignedLongLong(v
);
169 if (x
== (unsigned PY_LONG_LONG
)-1 && PyErr_Occurred())
177 /* Floating point helpers */
180 unpack_float(const char *p
, /* start of 4-byte string */
181 int le
) /* true for little-endian, false for big-endian */
185 x
= _PyFloat_Unpack4((unsigned char *)p
, le
);
186 if (x
== -1.0 && PyErr_Occurred())
188 return PyFloat_FromDouble(x
);
192 unpack_double(const char *p
, /* start of 8-byte string */
193 int le
) /* true for little-endian, false for big-endian */
197 x
= _PyFloat_Unpack8((unsigned char *)p
, le
);
198 if (x
== -1.0 && PyErr_Occurred())
200 return PyFloat_FromDouble(x
);
204 /* The translation function for each format character is table driven */
206 typedef struct _formatdef
{
210 PyObject
* (*unpack
)(const char *,
211 const struct _formatdef
*);
212 int (*pack
)(char *, PyObject
*,
213 const struct _formatdef
*);
216 /* A large number of small routines follow, with names of the form
220 [bln] distiguishes among big-endian, little-endian and native.
221 [pu] distiguishes between pack (to struct) and unpack (from struct).
222 TYPE is one of char, byte, ubyte, etc.
225 /* Native mode routines. ****************************************************/
227 In all n[up]_<type> routines handling types larger than 1 byte, there is
228 *no* guarantee that the p pointer is properly aligned for each type,
229 therefore memcpy is called. An intermediate variable is used to
230 compensate for big-endian architectures.
231 Normally both the intermediate variable and the memcpy call will be
232 skipped by C optimisation in little-endian architectures (gcc >= 2.91
236 nu_char(const char *p
, const formatdef
*f
)
238 return PyString_FromStringAndSize(p
, 1);
242 nu_byte(const char *p
, const formatdef
*f
)
244 return PyInt_FromLong((long) *(signed char *)p
);
248 nu_ubyte(const char *p
, const formatdef
*f
)
250 return PyInt_FromLong((long) *(unsigned char *)p
);
254 nu_short(const char *p
, const formatdef
*f
)
257 memcpy((char *)&x
, p
, sizeof x
);
258 return PyInt_FromLong((long)x
);
262 nu_ushort(const char *p
, const formatdef
*f
)
265 memcpy((char *)&x
, p
, sizeof x
);
266 return PyInt_FromLong((long)x
);
270 nu_int(const char *p
, const formatdef
*f
)
273 memcpy((char *)&x
, p
, sizeof x
);
274 return PyInt_FromLong((long)x
);
278 nu_uint(const char *p
, const formatdef
*f
)
281 memcpy((char *)&x
, p
, sizeof x
);
282 return PyLong_FromUnsignedLong((unsigned long)x
);
286 nu_long(const char *p
, const formatdef
*f
)
289 memcpy((char *)&x
, p
, sizeof x
);
290 return PyInt_FromLong(x
);
294 nu_ulong(const char *p
, const formatdef
*f
)
297 memcpy((char *)&x
, p
, sizeof x
);
298 return PyLong_FromUnsignedLong(x
);
301 /* Native mode doesn't support q or Q unless the platform C supports
302 long long (or, on Windows, __int64). */
304 #ifdef HAVE_LONG_LONG
307 nu_longlong(const char *p
, const formatdef
*f
)
310 memcpy((char *)&x
, p
, sizeof x
);
311 return PyLong_FromLongLong(x
);
315 nu_ulonglong(const char *p
, const formatdef
*f
)
317 unsigned PY_LONG_LONG x
;
318 memcpy((char *)&x
, p
, sizeof x
);
319 return PyLong_FromUnsignedLongLong(x
);
325 nu_float(const char *p
, const formatdef
*f
)
328 memcpy((char *)&x
, p
, sizeof x
);
329 return PyFloat_FromDouble((double)x
);
333 nu_double(const char *p
, const formatdef
*f
)
336 memcpy((char *)&x
, p
, sizeof x
);
337 return PyFloat_FromDouble(x
);
341 nu_void_p(const char *p
, const formatdef
*f
)
344 memcpy((char *)&x
, p
, sizeof x
);
345 return PyLong_FromVoidPtr(x
);
349 np_byte(char *p
, PyObject
*v
, const formatdef
*f
)
352 if (get_long(v
, &x
) < 0)
354 if (x
< -128 || x
> 127){
355 PyErr_SetString(StructError
,
356 "byte format requires -128<=number<=127");
364 np_ubyte(char *p
, PyObject
*v
, const formatdef
*f
)
367 if (get_long(v
, &x
) < 0)
369 if (x
< 0 || x
> 255){
370 PyErr_SetString(StructError
,
371 "ubyte format requires 0<=number<=255");
379 np_char(char *p
, PyObject
*v
, const formatdef
*f
)
381 if (!PyString_Check(v
) || PyString_Size(v
) != 1) {
382 PyErr_SetString(StructError
,
383 "char format require string of length 1");
386 *p
= *PyString_AsString(v
);
391 np_short(char *p
, PyObject
*v
, const formatdef
*f
)
395 if (get_long(v
, &x
) < 0)
397 if (x
< SHRT_MIN
|| x
> SHRT_MAX
){
398 PyErr_SetString(StructError
,
399 "short format requires " STRINGIFY(SHRT_MIN
)
400 "<=number<=" STRINGIFY(SHRT_MAX
));
404 memcpy(p
, (char *)&y
, sizeof y
);
409 np_ushort(char *p
, PyObject
*v
, const formatdef
*f
)
413 if (get_long(v
, &x
) < 0)
415 if (x
< 0 || x
> USHRT_MAX
){
416 PyErr_SetString(StructError
,
417 "short format requires 0<=number<=" STRINGIFY(USHRT_MAX
));
420 y
= (unsigned short)x
;
421 memcpy(p
, (char *)&y
, sizeof y
);
426 np_int(char *p
, PyObject
*v
, const formatdef
*f
)
430 if (get_long(v
, &x
) < 0)
433 memcpy(p
, (char *)&y
, sizeof y
);
438 np_uint(char *p
, PyObject
*v
, const formatdef
*f
)
442 if (get_ulong(v
, &x
) < 0)
445 memcpy(p
, (char *)&y
, sizeof y
);
450 np_long(char *p
, PyObject
*v
, const formatdef
*f
)
453 if (get_long(v
, &x
) < 0)
455 memcpy(p
, (char *)&x
, sizeof x
);
460 np_ulong(char *p
, PyObject
*v
, const formatdef
*f
)
463 if (get_ulong(v
, &x
) < 0)
465 memcpy(p
, (char *)&x
, sizeof x
);
469 #ifdef HAVE_LONG_LONG
472 np_longlong(char *p
, PyObject
*v
, const formatdef
*f
)
475 if (get_longlong(v
, &x
) < 0)
477 memcpy(p
, (char *)&x
, sizeof x
);
482 np_ulonglong(char *p
, PyObject
*v
, const formatdef
*f
)
484 unsigned PY_LONG_LONG x
;
485 if (get_ulonglong(v
, &x
) < 0)
487 memcpy(p
, (char *)&x
, sizeof x
);
493 np_float(char *p
, PyObject
*v
, const formatdef
*f
)
495 float x
= (float)PyFloat_AsDouble(v
);
496 if (x
== -1 && PyErr_Occurred()) {
497 PyErr_SetString(StructError
,
498 "required argument is not a float");
501 memcpy(p
, (char *)&x
, sizeof x
);
506 np_double(char *p
, PyObject
*v
, const formatdef
*f
)
508 double x
= PyFloat_AsDouble(v
);
509 if (x
== -1 && PyErr_Occurred()) {
510 PyErr_SetString(StructError
,
511 "required argument is not a float");
514 memcpy(p
, (char *)&x
, sizeof(double));
519 np_void_p(char *p
, PyObject
*v
, const formatdef
*f
)
526 assert(PyLong_Check(v
));
527 x
= PyLong_AsVoidPtr(v
);
529 if (x
== NULL
&& PyErr_Occurred())
531 memcpy(p
, (char *)&x
, sizeof x
);
535 static formatdef native_table
[] = {
536 {'x', sizeof(char), 0, NULL
},
537 {'b', sizeof(char), 0, nu_byte
, np_byte
},
538 {'B', sizeof(char), 0, nu_ubyte
, np_ubyte
},
539 {'c', sizeof(char), 0, nu_char
, np_char
},
540 {'s', sizeof(char), 0, NULL
},
541 {'p', sizeof(char), 0, NULL
},
542 {'h', sizeof(short), SHORT_ALIGN
, nu_short
, np_short
},
543 {'H', sizeof(short), SHORT_ALIGN
, nu_ushort
, np_ushort
},
544 {'i', sizeof(int), INT_ALIGN
, nu_int
, np_int
},
545 {'I', sizeof(int), INT_ALIGN
, nu_uint
, np_uint
},
546 {'l', sizeof(long), LONG_ALIGN
, nu_long
, np_long
},
547 {'L', sizeof(long), LONG_ALIGN
, nu_ulong
, np_ulong
},
548 {'f', sizeof(float), FLOAT_ALIGN
, nu_float
, np_float
},
549 {'d', sizeof(double), DOUBLE_ALIGN
, nu_double
, np_double
},
550 {'P', sizeof(void *), VOID_P_ALIGN
, nu_void_p
, np_void_p
},
551 #ifdef HAVE_LONG_LONG
552 {'q', sizeof(PY_LONG_LONG
), LONG_LONG_ALIGN
, nu_longlong
, np_longlong
},
553 {'Q', sizeof(PY_LONG_LONG
), LONG_LONG_ALIGN
, nu_ulonglong
,np_ulonglong
},
558 /* Big-endian routines. *****************************************************/
561 bu_int(const char *p
, const formatdef
*f
)
566 x
= (x
<<8) | (*p
++ & 0xFF);
568 /* Extend the sign bit. */
569 if (SIZEOF_LONG
> f
->size
)
570 x
|= -(x
& (1L << (8*f
->size
- 1)));
571 return PyInt_FromLong(x
);
575 bu_uint(const char *p
, const formatdef
*f
)
580 x
= (x
<<8) | (*p
++ & 0xFF);
583 return PyLong_FromUnsignedLong(x
);
585 return PyInt_FromLong((long)x
);
589 bu_longlong(const char *p
, const formatdef
*f
)
591 return _PyLong_FromByteArray((const unsigned char *)p
,
593 0, /* little-endian */
598 bu_ulonglong(const char *p
, const formatdef
*f
)
600 return _PyLong_FromByteArray((const unsigned char *)p
,
602 0, /* little-endian */
607 bu_float(const char *p
, const formatdef
*f
)
609 return unpack_float(p
, 0);
613 bu_double(const char *p
, const formatdef
*f
)
615 return unpack_double(p
, 0);
619 bp_int(char *p
, PyObject
*v
, const formatdef
*f
)
623 if (get_long(v
, &x
) < 0)
634 bp_uint(char *p
, PyObject
*v
, const formatdef
*f
)
638 if (get_ulong(v
, &x
) < 0)
649 bp_longlong(char *p
, PyObject
*v
, const formatdef
*f
)
655 res
= _PyLong_AsByteArray((PyLongObject
*)v
,
658 0, /* little_endian */
665 bp_ulonglong(char *p
, PyObject
*v
, const formatdef
*f
)
671 res
= _PyLong_AsByteArray((PyLongObject
*)v
,
674 0, /* little_endian */
681 bp_float(char *p
, PyObject
*v
, const formatdef
*f
)
683 double x
= PyFloat_AsDouble(v
);
684 if (x
== -1 && PyErr_Occurred()) {
685 PyErr_SetString(StructError
,
686 "required argument is not a float");
689 return _PyFloat_Pack4(x
, (unsigned char *)p
, 0);
693 bp_double(char *p
, PyObject
*v
, const formatdef
*f
)
695 double x
= PyFloat_AsDouble(v
);
696 if (x
== -1 && PyErr_Occurred()) {
697 PyErr_SetString(StructError
,
698 "required argument is not a float");
701 return _PyFloat_Pack8(x
, (unsigned char *)p
, 0);
704 static formatdef bigendian_table
[] = {
706 {'b', 1, 0, bu_int
, bp_int
},
707 {'B', 1, 0, bu_uint
, bp_int
},
708 {'c', 1, 0, nu_char
, np_char
},
711 {'h', 2, 0, bu_int
, bp_int
},
712 {'H', 2, 0, bu_uint
, bp_uint
},
713 {'i', 4, 0, bu_int
, bp_int
},
714 {'I', 4, 0, bu_uint
, bp_uint
},
715 {'l', 4, 0, bu_int
, bp_int
},
716 {'L', 4, 0, bu_uint
, bp_uint
},
717 {'q', 8, 0, bu_longlong
, bp_longlong
},
718 {'Q', 8, 0, bu_ulonglong
, bp_ulonglong
},
719 {'f', 4, 0, bu_float
, bp_float
},
720 {'d', 8, 0, bu_double
, bp_double
},
724 /* Little-endian routines. *****************************************************/
727 lu_int(const char *p
, const formatdef
*f
)
732 x
= (x
<<8) | (p
[--i
] & 0xFF);
734 /* Extend the sign bit. */
735 if (SIZEOF_LONG
> f
->size
)
736 x
|= -(x
& (1L << (8*f
->size
- 1)));
737 return PyInt_FromLong(x
);
741 lu_uint(const char *p
, const formatdef
*f
)
746 x
= (x
<<8) | (p
[--i
] & 0xFF);
749 return PyLong_FromUnsignedLong(x
);
751 return PyInt_FromLong((long)x
);
755 lu_longlong(const char *p
, const formatdef
*f
)
757 return _PyLong_FromByteArray((const unsigned char *)p
,
759 1, /* little-endian */
764 lu_ulonglong(const char *p
, const formatdef
*f
)
766 return _PyLong_FromByteArray((const unsigned char *)p
,
768 1, /* little-endian */
773 lu_float(const char *p
, const formatdef
*f
)
775 return unpack_float(p
, 1);
779 lu_double(const char *p
, const formatdef
*f
)
781 return unpack_double(p
, 1);
785 lp_int(char *p
, PyObject
*v
, const formatdef
*f
)
789 if (get_long(v
, &x
) < 0)
800 lp_uint(char *p
, PyObject
*v
, const formatdef
*f
)
804 if (get_ulong(v
, &x
) < 0)
815 lp_longlong(char *p
, PyObject
*v
, const formatdef
*f
)
821 res
= _PyLong_AsByteArray((PyLongObject
*)v
,
824 1, /* little_endian */
831 lp_ulonglong(char *p
, PyObject
*v
, const formatdef
*f
)
837 res
= _PyLong_AsByteArray((PyLongObject
*)v
,
840 1, /* little_endian */
847 lp_float(char *p
, PyObject
*v
, const formatdef
*f
)
849 double x
= PyFloat_AsDouble(v
);
850 if (x
== -1 && PyErr_Occurred()) {
851 PyErr_SetString(StructError
,
852 "required argument is not a float");
855 return _PyFloat_Pack4(x
, (unsigned char *)p
, 1);
859 lp_double(char *p
, PyObject
*v
, const formatdef
*f
)
861 double x
= PyFloat_AsDouble(v
);
862 if (x
== -1 && PyErr_Occurred()) {
863 PyErr_SetString(StructError
,
864 "required argument is not a float");
867 return _PyFloat_Pack8(x
, (unsigned char *)p
, 1);
870 static formatdef lilendian_table
[] = {
872 {'b', 1, 0, lu_int
, lp_int
},
873 {'B', 1, 0, lu_uint
, lp_int
},
874 {'c', 1, 0, nu_char
, np_char
},
877 {'h', 2, 0, lu_int
, lp_int
},
878 {'H', 2, 0, lu_uint
, lp_uint
},
879 {'i', 4, 0, lu_int
, lp_int
},
880 {'I', 4, 0, lu_uint
, lp_uint
},
881 {'l', 4, 0, lu_int
, lp_int
},
882 {'L', 4, 0, lu_uint
, lp_uint
},
883 {'q', 8, 0, lu_longlong
, lp_longlong
},
884 {'Q', 8, 0, lu_ulonglong
, lp_ulonglong
},
885 {'f', 4, 0, lu_float
, lp_float
},
886 {'d', 8, 0, lu_double
, lp_double
},
891 static const formatdef
*
892 whichtable(char **pfmt
)
894 const char *fmt
= (*pfmt
)++; /* May be backed out of later */
897 return lilendian_table
;
899 case '!': /* Network byte order is big-endian */
900 return bigendian_table
;
901 case '=': { /* Host byte order -- different from native in aligment! */
903 char *p
= (char *) &n
;
905 return lilendian_table
;
907 return bigendian_table
;
910 --*pfmt
; /* Back out of pointer increment */
918 /* Get the table entry for a format code */
920 static const formatdef
*
921 getentry(int c
, const formatdef
*f
)
923 for (; f
->format
!= '\0'; f
++) {
924 if (f
->format
== c
) {
928 PyErr_SetString(StructError
, "bad char in struct format");
933 /* Align a size according to a format code */
936 align(int size
, int c
, const formatdef
*e
)
938 if (e
->format
== c
) {
940 size
= ((size
+ e
->alignment
- 1)
949 /* calculate the size of a format string */
952 calcsize(const char *fmt
, const formatdef
*f
)
957 int size
, num
, itemsize
, x
;
961 while ((c
= *s
++) != '\0') {
962 if (isspace(Py_CHARMASK(c
)))
964 if ('0' <= c
&& c
<= '9') {
966 while ('0' <= (c
= *s
++) && c
<= '9') {
967 x
= num
*10 + (c
- '0');
971 "overflow in item count");
986 size
= align(size
, c
, e
);
989 if (x
/itemsize
!= num
|| size
< 0) {
990 PyErr_SetString(StructError
,
991 "total struct size too long");
1000 PyDoc_STRVAR(calcsize__doc__
,
1001 "calcsize(fmt) -> int\n\
1002 Return size of C struct described by format string fmt.\n\
1003 See struct.__doc__ for more on format strings.");
1006 struct_calcsize(PyObject
*self
, PyObject
*args
)
1012 if (!PyArg_ParseTuple(args
, "s:calcsize", &fmt
))
1014 f
= whichtable(&fmt
);
1015 size
= calcsize(fmt
, f
);
1018 return PyInt_FromLong((long)size
);
1022 PyDoc_STRVAR(pack__doc__
,
1023 "pack(fmt, v1, v2, ...) -> string\n\
1024 Return string containing values v1, v2, ... packed according to fmt.\n\
1025 See struct.__doc__ for more on format strings.");
1028 struct_pack(PyObject
*self
, PyObject
*args
)
1030 const formatdef
*f
, *e
;
1031 PyObject
*format
, *result
, *v
;
1035 char *s
, *res
, *restart
, *nres
;
1038 if (args
== NULL
|| !PyTuple_Check(args
) ||
1039 (n
= PyTuple_Size(args
)) < 1)
1041 PyErr_SetString(PyExc_TypeError
,
1042 "struct.pack requires at least one argument");
1045 format
= PyTuple_GetItem(args
, 0);
1046 fmt
= PyString_AsString(format
);
1049 f
= whichtable(&fmt
);
1050 size
= calcsize(fmt
, f
);
1053 result
= PyString_FromStringAndSize((char *)NULL
, size
);
1059 res
= restart
= PyString_AsString(result
);
1061 while ((c
= *s
++) != '\0') {
1062 if (isspace(Py_CHARMASK(c
)))
1064 if ('0' <= c
&& c
<= '9') {
1066 while ('0' <= (c
= *s
++) && c
<= '9')
1067 num
= num
*10 + (c
- '0');
1077 nres
= restart
+ align((int)(res
-restart
), c
, e
);
1078 /* Fill padd bytes with zeros */
1081 if (num
== 0 && c
!= 's')
1085 /* doesn't consume arguments */
1086 memset(res
, '\0', num
);
1091 PyErr_SetString(StructError
,
1092 "insufficient arguments to pack");
1095 v
= PyTuple_GetItem(args
, i
++);
1099 /* num is string size, not repeat count */
1101 if (!PyString_Check(v
)) {
1102 PyErr_SetString(StructError
,
1103 "argument for 's' must be a string");
1106 n
= PyString_Size(v
);
1110 memcpy(res
, PyString_AsString(v
), n
);
1112 memset(res
+n
, '\0', num
-n
);
1116 else if (c
== 'p') {
1117 /* num is string size + 1,
1118 to fit in the count byte */
1120 num
--; /* now num is max string size */
1121 if (!PyString_Check(v
)) {
1122 PyErr_SetString(StructError
,
1123 "argument for 'p' must be a string");
1126 n
= PyString_Size(v
);
1130 memcpy(res
+1, PyString_AsString(v
), n
);
1132 /* no real need, just to be nice */
1133 memset(res
+1+n
, '\0', num
-n
);
1136 *res
++ = n
; /* store the length byte */
1141 if (e
->pack(res
, v
, e
) < 0)
1145 } while (--num
> 0);
1149 PyErr_SetString(StructError
,
1150 "too many arguments for pack format");
1162 PyDoc_STRVAR(unpack__doc__
,
1163 "unpack(fmt, string) -> (v1, v2, ...)\n\
1164 Unpack the string, containing packed C structure data, according\n\
1165 to fmt. Requires len(string)==calcsize(fmt).\n\
1166 See struct.__doc__ for more on format strings.");
1169 struct_unpack(PyObject
*self
, PyObject
*args
)
1171 const formatdef
*f
, *e
;
1172 char *str
, *start
, *fmt
, *s
;
1177 if (!PyArg_ParseTuple(args
, "ss#:unpack", &fmt
, &start
, &len
))
1179 f
= whichtable(&fmt
);
1180 size
= calcsize(fmt
, f
);
1184 PyErr_SetString(StructError
,
1185 "unpack str size does not match format");
1188 res
= PyList_New(0);
1193 while ((c
= *s
++) != '\0') {
1194 if (isspace(Py_CHARMASK(c
)))
1196 if ('0' <= c
&& c
<= '9') {
1198 while ('0' <= (c
= *s
++) && c
<= '9')
1199 num
= num
*10 + (c
- '0');
1209 str
= start
+ align((int)(str
-start
), c
, e
);
1210 if (num
== 0 && c
!= 's')
1219 /* num is string size, not repeat count */
1220 v
= PyString_FromStringAndSize(str
, num
);
1226 else if (c
== 'p') {
1227 /* num is string buffer size,
1229 int n
= *(unsigned char*)str
;
1230 /* first byte (unsigned) is string size */
1233 v
= PyString_FromStringAndSize(str
+1, n
);
1240 v
= e
->unpack(str
, e
);
1245 if (v
== NULL
|| PyList_Append(res
, v
) < 0)
1248 } while (--num
> 0);
1251 v
= PyList_AsTuple(res
);
1261 /* List of functions */
1263 static PyMethodDef struct_methods
[] = {
1264 {"calcsize", struct_calcsize
, METH_VARARGS
, calcsize__doc__
},
1265 {"pack", struct_pack
, METH_VARARGS
, pack__doc__
},
1266 {"unpack", struct_unpack
, METH_VARARGS
, unpack__doc__
},
1267 {NULL
, NULL
} /* sentinel */
1271 /* Module initialization */
1278 /* Create the module and add the functions */
1279 m
= Py_InitModule4("struct", struct_methods
, struct__doc__
,
1280 (PyObject
*)NULL
, PYTHON_API_VERSION
);
1284 /* Add some symbolic constants to the module */
1285 if (StructError
== NULL
) {
1286 StructError
= PyErr_NewException("struct.error", NULL
, NULL
);
1287 if (StructError
== NULL
)
1290 Py_INCREF(StructError
);
1291 PyModule_AddObject(m
, "error", StructError
);