Fix up struct docstrings, add struct.pack_to function for symmetry
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 @@
         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 @@
         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)