blob: 027caa258ba9726366410a17cbd5b1055be428bf [file] [log] [blame]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001"""
2Functions to convert between Python values and C structs.
3Python strings are used to hold the data representing the C struct
4and also as format strings to describe the layout of data in the C struct.
5
6The optional first format char indicates byte order, size and alignment:
7 @: native order, size & alignment (default)
8 =: native order, std. size & alignment
9 <: little-endian, std. size & alignment
10 >: big-endian, std. size & alignment
11 !: same as >
12
13The remaining chars indicate types of args and must match exactly;
14these can be preceded by a decimal repeat count:
15 x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
16 h:short; H:unsigned short; i:int; I:unsigned int;
17 l:long; L:unsigned long; f:float; d:double.
18Special cases (preceding decimal count indicates length):
19 s:string (array of char); p: pascal string (with count byte).
20Special case (only available in native format):
21 P:an integer type that is wide enough to hold a pointer.
22Special case (not in native mode unless 'long long' in platform C):
23 q:long long; Q:unsigned long long
24Whitespace between formats is ignored.
25
26The variable struct.error is an exception raised on errors.
27"""
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000028
29# XXX Move the bytes and str8 casts into the _struct module
30
31__version__ = '3.0'
32
Thomas Wouters477c8d52006-05-27 19:21:47 +000033
Guido van Rossume625fd52007-05-27 09:19:04 +000034from _struct import Struct as _Struct, error
35
36class Struct(_Struct):
37 def __init__(self, fmt):
38 if isinstance(fmt, str):
39 fmt = str8(fmt)
40 _Struct.__init__(self, fmt)
Thomas Wouters477c8d52006-05-27 19:21:47 +000041
42_MAXCACHE = 100
43_cache = {}
44
45def _compile(fmt):
46 # Internal: compile struct pattern
47 if len(_cache) >= _MAXCACHE:
48 _cache.clear()
Guido van Rossume625fd52007-05-27 09:19:04 +000049 s = Struct(fmt)
Thomas Wouters477c8d52006-05-27 19:21:47 +000050 _cache[fmt] = s
51 return s
52
53def calcsize(fmt):
54 """
55 Return size of C struct described by format string fmt.
56 See struct.__doc__ for more on format strings.
57 """
58 try:
59 o = _cache[fmt]
60 except KeyError:
61 o = _compile(fmt)
62 return o.size
63
64def pack(fmt, *args):
65 """
66 Return string containing values v1, v2, ... packed according to fmt.
67 See struct.__doc__ for more on format strings.
68 """
69 try:
70 o = _cache[fmt]
71 except KeyError:
72 o = _compile(fmt)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000073 return bytes(o.pack(*args))
Thomas Wouters477c8d52006-05-27 19:21:47 +000074
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000075def pack_into(fmt, buf, offset, *args):
Thomas Wouters477c8d52006-05-27 19:21:47 +000076 """
Thomas Wouters0e3f5912006-08-11 14:57:12 +000077 Pack the values v1, v2, ... according to fmt, write
Thomas Wouters477c8d52006-05-27 19:21:47 +000078 the packed bytes into the writable buffer buf starting at offset.
79 See struct.__doc__ for more on format strings.
80 """
81 try:
82 o = _cache[fmt]
83 except KeyError:
84 o = _compile(fmt)
Guido van Rossume625fd52007-05-27 09:19:04 +000085 o.pack_into(buf, offset, *args)
Thomas Wouters477c8d52006-05-27 19:21:47 +000086
87def unpack(fmt, s):
88 """
89 Unpack the string, containing packed C structure data, according
90 to fmt. Requires len(string)==calcsize(fmt).
91 See struct.__doc__ for more on format strings.
92 """
93 try:
94 o = _cache[fmt]
95 except KeyError:
96 o = _compile(fmt)
97 return o.unpack(s)
98
99def unpack_from(fmt, buf, offset=0):
100 """
101 Unpack the buffer, containing packed C structure data, according to
102 fmt starting at offset. Requires len(buffer[offset:]) >= calcsize(fmt).
103 See struct.__doc__ for more on format strings.
104 """
105 try:
106 o = _cache[fmt]
107 except KeyError:
108 o = _compile(fmt)
109 return o.unpack_from(buf, offset)