summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Stein <gstein@lyra.org>2001-05-14 09:32:26 (GMT)
committerGreg Stein <gstein@lyra.org>2001-05-14 09:32:26 (GMT)
commit834f4dd7c921593674409b9088458f378ac00ca4 (patch)
tree92daf197ff690ba4079be03f425fa195b00c0911
parenta814db579db9cfcaa3cf2ca7bae539cf2c80a9f0 (diff)
downloadcpython-834f4dd7c921593674409b9088458f378ac00ca4.zip
cpython-834f4dd7c921593674409b9088458f378ac00ca4.tar.gz
cpython-834f4dd7c921593674409b9088458f378ac00ca4.tar.bz2
Fix the .find() method for memory maps.
1) it didn't obey the "start" parameter (and when it does, we must validate the value) 2) the return value needs to be an absolute index, rather than relative to some arbitrary point in the file (checking CVS, it appears this method never worked; these changes bring it into line with typical .find() behavior)
-rw-r--r--Modules/mmapmodule.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index dd7ff6d..acf85a4 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -232,8 +232,17 @@ mmap_find_method(mmap_object *self,
if (!PyArg_ParseTuple (args, "s#|i:find", &needle, &len, &start)) {
return NULL;
} else {
- char *p = self->data+self->pos;
- char *e = self->data+self->size;
+ char *p;
+ char *e = self->data + self->size;
+
+ if (start < 0)
+ start += self->size;
+ if (start < 0)
+ start = 0;
+ else if (start > self->size)
+ start = self->size;
+ p = self->data + start;
+
while (p < e) {
char *s = p;
char *n = needle;
@@ -243,7 +252,7 @@ mmap_find_method(mmap_object *self,
if (!*n) {
return Py_BuildValue (
"i",
- (int) (p - (self->data + start)));
+ (int) (p - self->data));
}
p++;
}