[Python-checkins] r46172 - sandbox/trunk/newstruct/Modules/_newstruct.c

bob.ippolito python-checkins at python.org
Wed May 24 16:21:57 CEST 2006


Author: bob.ippolito
Date: Wed May 24 16:21:56 2006
New Revision: 46172

Modified:
   sandbox/trunk/newstruct/Modules/_newstruct.c
Log:
simplify code by removing loops

Modified: sandbox/trunk/newstruct/Modules/_newstruct.c
==============================================================================
--- sandbox/trunk/newstruct/Modules/_newstruct.c	(original)
+++ sandbox/trunk/newstruct/Modules/_newstruct.c	Wed May 24 16:21:56 2006
@@ -32,7 +32,7 @@
 typedef struct _formatcode {
 	const struct _formatdef *fmtdef;
 	int offset;
-	int repeat;
+	int size;
 } formatcode;
 
 /* Struct object interface */
@@ -963,7 +963,7 @@
 	const char *s;
 	const char *fmt;
 	char c;
-	int size, len, numcodes, num, itemsize, x;
+	int size, len, num, itemsize, x;
 
 	fmt = PyString_AS_STRING(self->s_format);
 
@@ -972,7 +972,6 @@
 	s = fmt;
 	size = 0;
 	len = 0;
-	numcodes = 0;
 	while ((c = *s++) != '\0') {
 		if (isspace(Py_CHARMASK(c)))
 			continue;
@@ -1004,7 +1003,6 @@
 			case 'x': break;
 			default: len += num; break;
 		}
-		if (c != 'x') numcodes++;
 
 		itemsize = e->size;
 		size = align(size, c, e);
@@ -1019,7 +1017,7 @@
 
 	self->s_size = size;
 	self->s_len = len;
-	codes = PyMem_MALLOC((numcodes + 1) * sizeof(formatcode));
+	codes = PyMem_MALLOC((len + 1) * sizeof(formatcode));
 	if (codes == NULL) {
 		PyErr_NoMemory();
 		return -1;
@@ -1044,17 +1042,27 @@
 		e = getentry(c, f);
 		
 		size = align(size, c, e);
-		if (c != 'x') {
+		if (c == 's' || c == 'p') {
 			codes->offset = size;
-			codes->repeat = num;
+			codes->size = num;
 			codes->fmtdef = e;
 			codes++;
+			size += num;
+		} else if (c == 'x') {
+			size += num;
+		} else {
+			while (--num >= 0) {
+				codes->offset = size;
+				codes->size = e->size;
+				codes->fmtdef = e;
+				codes++;
+				size += e->size;
+			}
 		}
-		size += num * e->size;
 	}
 	codes->fmtdef = NULL;
-	codes->offset = -1;
-	codes->repeat = -1;
+	codes->offset = size;
+	codes->size = 0;
 	
 	return 0;
 }
@@ -1121,31 +1129,27 @@
 		return NULL;
 
 	for (code = soself->s_codes; code->fmtdef != NULL; code++) {
-		Py_ssize_t n;
 		PyObject *v;
 		const formatdef *e = code->fmtdef;
 		const char *res = startfrom + code->offset;
 		if (e->format == 's') {
-			v = PyString_FromStringAndSize(res, code->repeat);
+			v = PyString_FromStringAndSize(res, code->size);
 			if (v == NULL)
 				goto fail;
 			PyTuple_SET_ITEM(result, i++, v);
 		} else if (e->format == 'p') {
-			n = *(unsigned char*)res;
-			if (n >= code->repeat)
-				n = code->repeat - 1;
+			Py_ssize_t n = *(unsigned char*)res;
+			if (n >= code->size)
+				n = code->size - 1;
 			v = PyString_FromStringAndSize(res + 1, n);
 			if (v == NULL)
 				goto fail;
 			PyTuple_SET_ITEM(result, i++, v);
 		} else {
-			for (n = 0; n < code->repeat; n++) {
-				v = e->unpack(res, e);
-				if (v == NULL)
-					goto fail;
-				PyTuple_SET_ITEM(result, i++, v);
-				res += e->size;
-			}
+			v = e->unpack(res, e);
+			if (v == NULL)
+				goto fail;
+			PyTuple_SET_ITEM(result, i++, v);
 		}
 	}
 
@@ -1269,8 +1273,8 @@
 				goto fail;
 			}
 			n = PyString_GET_SIZE(v);
-			if (n > code->repeat)
-				n = code->repeat;
+			if (n > code->size)
+				n = code->size;
 			if (n > 0)
 				memcpy(res, PyString_AS_STRING(v), n);
 		} else if (e->format == 'p') {
@@ -1281,20 +1285,17 @@
 				goto fail;
 			}
 			n = PyString_GET_SIZE(v);
-			if (n > (code->repeat - 1))
-				n = code->repeat - 1;
+			if (n > (code->size - 1))
+				n = code->size - 1;
 			if (n > 0)
 				memcpy(res + 1, PyString_AS_STRING(v), n);
 			if (n > 255)
 				n = 255;
 			*res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);
 		} else {
-			for (n = 0; n < code->repeat; n++) {
-				v = PyTuple_GET_ITEM(args, i++);
-				if (e->pack(res, v, e) < 0)
-					goto fail;
-				res += e->size;
-			}
+			v = PyTuple_GET_ITEM(args, i++);
+			if (e->pack(res, v, e) < 0)
+				goto fail;
 		}
 	}
 	


More information about the Python-checkins mailing list