diff Modules/structmodule.c @ 6241:ab64344e87db legacy-trunk

Contribution by Hannu Krosing (with some changes). Added 'p' format character for Pascal string (i.e. leading length byte). This uses the count prefix line 's' does, except that the count includes the length byte; i.e. '10p' takes 10 bytes packed but has space for a length byte and 9 data bytes.
author Guido van Rossum <guido@python.org>
date Fri, 05 Sep 1997 07:08:39 +0000
parents 9e432468f756
children 2c29b8982643
line wrap: on
line diff
--- a/Modules/structmodule.c	Fri Sep 05 07:01:19 1997 +0000
+++ b/Modules/structmodule.c	Fri Sep 05 07:08:39 1997 +0000
@@ -631,6 +631,7 @@
 	{'B',	sizeof(char),	0,		nu_ubyte,	np_byte},
 	{'c',	sizeof(char),	0,		nu_char,	np_char},
 	{'s',	sizeof(char),	0,		NULL},
+	{'p',	sizeof(char),	0,		NULL},
 	{'h',	sizeof(short),	SHORT_ALIGN,	nu_short,	np_short},
 	{'H',	sizeof(short),	SHORT_ALIGN,	nu_ushort,	np_short},
 	{'i',	sizeof(int),	INT_ALIGN,	nu_int,		np_int},
@@ -761,6 +762,7 @@
 	{'B',	1,		0,		bu_uint,	bp_int},
 	{'c',	1,		0,		nu_char,	np_char},
 	{'s',	1,		0,		NULL},
+	{'p',	1,		0,		NULL},
 	{'h',	2,		0,		bu_int,		bp_int},
 	{'H',	2,		0,		bu_uint,	bp_uint},
 	{'i',	4,		0,		bu_int,		bp_int},
@@ -891,6 +893,7 @@
 	{'B',	1,		0,		lu_uint,	lp_int},
 	{'c',	1,		0,		nu_char,	np_char},
 	{'s',	1,		0,		NULL},
+	{'p',	1,		0,		NULL},
 	{'h',	2,		0,		lu_int,		lp_int},
 	{'H',	2,		0,		lu_uint,	lp_uint},
 	{'i',	4,		0,		lu_int,		lp_int},
@@ -1132,6 +1135,28 @@
 				res += num;
 				break;
 			}
+			else if (c == 'p') {
+				/* num is string size + 1,
+				   to fit in the count byte */
+				int n;
+				num--; /* now num is max string size */
+				if (!PyString_Check(v)) {
+					PyErr_SetString(StructError,
+					  "argument for 'p' must be a string");
+					goto fail;
+				}
+				n = PyString_Size(v);
+				if (n > num)
+					n = num;
+				if (n > 0)
+					memcpy(res+1, PyString_AsString(v), n);
+				if (n < num)
+					/* no real need, just to be nice */
+					memset(res+1+n, '\0', num-n);
+				*res++ = n; /* store the length byte */
+				res += num;
+				break;
+			}
 			else {
 				if (e->pack(res, v, e) < 0)
 					goto fail;
@@ -1216,6 +1241,19 @@
 				str += num;
 				num = 0;
 			}
+			else if (c == 'p') {
+				/* num is string buffer size,
+				   not repeat count */
+				int n = *(unsigned char*)str;
+				/* first byte (unsigned) is string size */
+				if (n >= num)
+					n = num-1;
+				v = PyString_FromStringAndSize(str+1, n);
+				if (v == NULL)
+					goto fail;
+				str += num;
+				num = 0;
+			}
 			else {
 				v = e->unpack(str, e);
 				if (v == NULL)