diff options
author | Greg Stein <gstein@lyra.org> | 2001-05-14 09:32:26 (GMT) |
---|---|---|
committer | Greg Stein <gstein@lyra.org> | 2001-05-14 09:32:26 (GMT) |
commit | 834f4dd7c921593674409b9088458f378ac00ca4 (patch) | |
tree | 92daf197ff690ba4079be03f425fa195b00c0911 | |
parent | a814db579db9cfcaa3cf2ca7bae539cf2c80a9f0 (diff) | |
download | cpython-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.c | 15 |
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++; } |