Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.

This commit is contained in:
Georg Brandl 2006-02-18 21:57:25 +00:00
parent d5b6715083
commit 47fab92542
1 changed files with 32 additions and 41 deletions

View 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
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;
}
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