[Python-checkins] r42468 - python/trunk/Modules/bz2module.c

georg.brandl python-checkins at python.org
Sat Feb 18 22:57:25 CET 2006


Author: georg.brandl
Date: Sat Feb 18 22:57:25 2006
New Revision: 42468

Modified:
   python/trunk/Modules/bz2module.c
Log:
Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.


Modified: python/trunk/Modules/bz2module.c
==============================================================================
--- python/trunk/Modules/bz2module.c	(original)
+++ python/trunk/Modules/bz2module.c	Sat Feb 18 22:57:25 2006
@@ -1017,50 +1017,43 @@
 			goto cleanup;;
 	}
 
-	if (offset < 0) {
-		if (where == 1) {
-			offset = self->pos + offset;
-			rewind = 1;
-		} else if (where == 2) {
-			if (self->size == -1) {
-				assert(self->mode != MODE_READ_EOF);
-				for (;;) {
-					Py_BEGIN_ALLOW_THREADS
-					chunksize = Util_UnivNewlineRead(
-							&bzerror, self->fp,
-							buffer, buffersize,
-							self);
-					self->pos += chunksize;
-					Py_END_ALLOW_THREADS
-
-					bytesread += chunksize;
-					if (bzerror == BZ_STREAM_END) {
-						break;
-					} else if (bzerror != BZ_OK) {
-						Util_CatchBZ2Error(bzerror);
-						goto cleanup;
-					}
+	if (where == 2) {
+		if (self->size == -1) {
+			assert(self->mode != MODE_READ_EOF);
+			for (;;) {
+				Py_BEGIN_ALLOW_THREADS
+				chunksize = Util_UnivNewlineRead(
+						&bzerror, self->fp,
+						buffer, buffersize,
+						self);
+				self->pos += chunksize;
+				Py_END_ALLOW_THREADS
+
+				bytesread += chunksize;
+				if (bzerror == BZ_STREAM_END) {
+					break;
+				} else if (bzerror != BZ_OK) {
+					Util_CatchBZ2Error(bzerror);
+					goto cleanup;
 				}
-				self->mode = MODE_READ_EOF;
-				self->size = self->pos;
-				bytesread = 0;
 			}
-			offset = self->size + offset;
-			if (offset >= self->pos)
-				offset -= self->pos;
-			else
-				rewind = 1;
+			self->mode = MODE_READ_EOF;
+			self->size = self->pos;
+			bytesread = 0;
 		}
-		if (offset < 0)
-			offset = 0;
-	} else if (where == 0) {
-		if (offset >= self->pos)
-			offset -= self->pos;
-		else
-			rewind = 1;
+		offset = self->size + offset;
+	} else if (where == 1) {
+		offset = self->pos + offset;
 	}
 
-	if (rewind) {
+	/* Before getting here, offset must be the absolute position the file 
+	 * pointer should be set to. */
+
+	if (offset >= self->pos) {
+		/* we can move forward */
+		offset -= self->pos;
+	} else {
+		/* we cannot move back, so rewind the stream */
 		BZ2_bzReadClose(&bzerror, self->fp);
 		if (bzerror != BZ_OK) {
 			Util_CatchBZ2Error(bzerror);
@@ -1079,11 +1072,9 @@
 			goto cleanup;
 		}
 		self->mode = MODE_READ;
-	} else if (self->mode == MODE_READ_EOF) {
-		goto exit;
 	}
 
-	if (offset == 0)
+	if (offset <= 0 || self->mode == MODE_READ_EOF)
 		goto exit;
 
 	/* Before getting here, offset must be set to the number of bytes


More information about the Python-checkins mailing list