diff options
author | Georg Brandl <georg@python.org> | 2006-02-18 21:57:28 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2006-02-18 21:57:28 (GMT) |
commit | dc2a854b139d4ff6ee80b7b1826612f1dabda952 (patch) | |
tree | 3933dfb6ccc92dfe7535bba6187eed3186ceacb8 | |
parent | f3cba11e55da33f6c83ba831716237b672cfcc42 (diff) | |
download | cpython-dc2a854b139d4ff6ee80b7b1826612f1dabda952.zip cpython-dc2a854b139d4ff6ee80b7b1826612f1dabda952.tar.gz cpython-dc2a854b139d4ff6ee80b7b1826612f1dabda952.tar.bz2 |
Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
-rw-r--r-- | Modules/bz2module.c | 75 |
1 files changed, 33 insertions, 42 deletions
diff --git a/Modules/bz2module.c b/Modules/bz2module.c index 7eaea28..9171068 100644 --- a/Modules/bz2module.c +++ b/Modules/bz2module.c @@ -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 |