summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/struct.py12
-rw-r--r--Lib/test/test_struct.py22
2 files changed, 34 insertions, 0 deletions
diff --git a/Lib/struct.py b/Lib/struct.py
index b4f56bb..51ee29a 100644
--- a/Lib/struct.py
+++ b/Lib/struct.py
@@ -62,6 +62,18 @@ def pack(fmt, *args):
o = _compile(fmt)
return o.pack(*args)
+def pack_to(fmt, buf, offset, *args):
+ """
+ Pack the values v2, v2, ... according to fmt, write
+ the packed bytes into the writable buffer buf starting at offset.
+ See struct.__doc__ for more on format strings.
+ """
+ try:
+ o = _cache[fmt]
+ except KeyError:
+ o = _compile(fmt)
+ return o.pack_to(buf, offset, *args)
+
def unpack(fmt, s):
"""
Unpack the string, containing packed C structure data, according
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index 6bc1f86..7981a52 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -509,6 +509,28 @@ class PackBufferTestCase(unittest.TestCase):
self.assertRaises(struct.error, s.pack_to, small_buf, 0, test_string)
self.assertRaises(struct.error, s.pack_to, small_buf, 2, test_string)
+ def test_pack_to_fn( self ):
+ test_string = 'Reykjavik rocks, eow!'
+ writable_buf = array.array('c', ' '*100)
+ fmt = '21s'
+ pack_to = lambda *args: struct.pack_to(fmt, *args)
+
+ # Test without offset
+ pack_to(writable_buf, 0, test_string)
+ from_buf = writable_buf.tostring()[:len(test_string)]
+ self.assertEquals(from_buf, test_string)
+
+ # Test with offset.
+ pack_to(writable_buf, 10, test_string)
+ from_buf = writable_buf.tostring()[:len(test_string)+10]
+ self.assertEquals(from_buf, (test_string[:10] + test_string))
+
+ # Go beyond boundaries.
+ small_buf = array.array('c', ' '*10)
+ self.assertRaises(struct.error, pack_to, small_buf, 0, test_string)
+ self.assertRaises(struct.error, pack_to, small_buf, 2, test_string)
+
+
def test_main():
test.test_support.run_unittest(PackBufferTestCase)