Thomas Wouters avatar Thomas Wouters committed c5b5055

Net result of Tim's checkins 2.28 through 2.31:

- SF but #417587: compiler warnings compiling 2.1.
Repaired *some* of the SGI compiler warnings Sjoerd Mullender
reported.

- Minor fiddling related to
SF patch 416251 2.1c1 mmapmodule: unused vrbl cleanup

- 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)

- Fix new compiler warnings. Also boost "start" from (C) int to long and
return a (C) long: PyArg_ParseTuple and Py_BuildValue may not let
us get at the size_t we really want, but C int is clearly too small
for a 64-bit box, and both the start parameter and the return value
should work for large mapped files even on 32-bit boxes. The code
really needs to be rethought from scratch (not by me, though ...).

Comments (0)

Files changed (1)

Modules/mmapmodule.c

 mmap_read_byte_method(mmap_object *self,
 		      PyObject *args)
 {
-	char value;
-	char *where;
 	CHECK_VALID(NULL);
         if (!PyArg_ParseTuple(args, ":read_byte"))
 		return NULL;
 	if (self->pos < self->size) {
-	        where = self->data + self->pos;
-		value = (char) *(where);
+	        char value = self->data[self->pos];
 		self->pos += 1;
-		return Py_BuildValue("c", (char) *(where));
+		return Py_BuildValue("c", value);
 	} else {
 		PyErr_SetString (PyExc_ValueError, "read byte out of range");
 		return NULL;
 mmap_find_method(mmap_object *self,
 		 PyObject *args)
 {
-	int start = self->pos;
+	long start = self->pos;
 	char *needle;
 	int len;
 
 	CHECK_VALID(NULL);
-	if (!PyArg_ParseTuple (args, "s#|i:find", &needle, &len, &start)) {
+	if (!PyArg_ParseTuple (args, "s#|l: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 ((size_t)start > self->size)
+                    start = self->size;
+                p = self->data + start;
+
 		while (p < e) {
 			char *s = p;
 			char *n = needle;
 			}
 			if (!*n) {
 				return Py_BuildValue (
-					"i",
-					(int) (p - (self->data + start)));
+					"l",
+					(long) (p - self->data));
 			}
 			p++;
 		}
 	m_obj->data = mmap(NULL, map_size, 
 			   prot, flags,
 			   fd, 0);
-	if (m_obj->data == (void *)-1)
+	if (m_obj->data == (char *)-1)
 	{
 		Py_DECREF(m_obj);
 		PyErr_SetFromErrno(mmap_module_error);
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.