]> granicus.if.org Git - python/commitdiff
Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
authorGeorg Brandl <georg@python.org>
Sat, 18 Feb 2006 21:57:25 +0000 (21:57 +0000)
committerGeorg Brandl <georg@python.org>
Sat, 18 Feb 2006 21:57:25 +0000 (21:57 +0000)
Modules/bz2module.c

index a0f66ee939f2e47d6a0e50d9adf6dca6cd7d5bc6..6dd1dbbc4c79d0ab5fd9fb62cbb806b27f1930b7 100644 (file)
@@ -1017,50 +1017,43 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args)
                        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 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args)
                        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