summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBob Ippolito <bob@redivi.com>2006-05-23 19:12:41 (GMT)
committerBob Ippolito <bob@redivi.com>2006-05-23 19:12:41 (GMT)
commit232f3c91f90655b10f3a6ec6d5b00eab37850de9 (patch)
tree032f4c6292f6bf46a59ed6c4e3cb686925717090 /Lib
parent7ccc95a315315568dd0660b5fb915f9e2e38f9da (diff)
downloadcpython-232f3c91f90655b10f3a6ec6d5b00eab37850de9.zip
cpython-232f3c91f90655b10f3a6ec6d5b00eab37850de9.tar.gz
cpython-232f3c91f90655b10f3a6ec6d5b00eab37850de9.tar.bz2
patch #1493701: performance enhancements for struct module
Diffstat (limited to 'Lib')
-rw-r--r--Lib/struct.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/Lib/struct.py b/Lib/struct.py
new file mode 100644
index 0000000..aa7af71
--- /dev/null
+++ b/Lib/struct.py
@@ -0,0 +1,76 @@
+"""
+Functions to convert between Python values and C structs.
+Python strings are used to hold the data representing the C struct
+and also as format strings to describe the layout of data in the C struct.
+
+The optional first format char indicates byte order, size and alignment:
+ @: native order, size & alignment (default)
+ =: native order, std. size & alignment
+ <: little-endian, std. size & alignment
+ >: big-endian, std. size & alignment
+ !: same as >
+
+The remaining chars indicate types of args and must match exactly;
+these can be preceded by a decimal repeat count:
+ x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
+ h:short; H:unsigned short; i:int; I:unsigned int;
+ l:long; L:unsigned long; f:float; d:double.
+Special cases (preceding decimal count indicates length):
+ s:string (array of char); p: pascal string (with count byte).
+Special case (only available in native format):
+ P:an integer type that is wide enough to hold a pointer.
+Special case (not in native mode unless 'long long' in platform C):
+ q:long long; Q:unsigned long long
+Whitespace between formats is ignored.
+
+The variable struct.error is an exception raised on errors.
+"""
+__version__ = '0.1'
+
+from _struct import Struct, error
+
+_MAXCACHE = 100
+_cache = {}
+
+def _compile(fmt):
+ # Internal: compile struct pattern
+ if len(_cache) >= _MAXCACHE:
+ _cache.clear()
+ s = Struct(fmt)
+ _cache[fmt] = s
+ return s
+
+def calcsize(fmt):
+ """
+ Return size of C struct described by format string fmt.
+ See struct.__doc__ for more on format strings.
+ """
+ try:
+ o = _cache[fmt]
+ except KeyError:
+ o = _compile(fmt)
+ return o.size
+
+def pack(fmt, *args):
+ """
+ Return string containing values v1, v2, ... packed according to fmt.
+ See struct.__doc__ for more on format strings.
+ """
+ try:
+ o = _cache[fmt]
+ except KeyError:
+ o = _compile(fmt)
+ return o.pack(*args)
+
+def unpack(fmt, s):
+ """
+ Unpack the string, containing packed C structure data, according
+ to fmt. Requires len(string)==calcsize(fmt).
+ See struct.__doc__ for more on format strings.
+ """
+ try:
+ o = _cache[fmt]
+ except KeyError:
+ o = _compile(fmt)
+ return o.unpack(s)
+