summaryrefslogtreecommitdiffstats
path: root/Modules/mmapmodule.c
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 /Modules/mmapmodule.c
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)
Diffstat (limited to 'Modules/mmapmodule.c')
-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++;
}