[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