diff options
author | Jeffrey Stedfast <fejj@ximian.com> | 2001-09-20 01:53:49 +0000 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2001-09-20 01:53:49 +0000 |
commit | f35147e30e33e6f57e55d7da2bd00d70ea045d42 (patch) | |
tree | b4ab693e5b0b3c767e4a69990d56d18b835de0ef | |
parent | 1b3b8c410b2b630f5423f6cf9edb1e12cd8d4ead (diff) | |
download | gmime-f35147e30e33e6f57e55d7da2bd00d70ea045d42.tar.gz |
Improve.
2001-09-19 Jeffrey Stedfast <fejj@ximian.com>
* gmime-stream-fs.c (stream_seek): Improve.
* gmime-stream-file.c (stream_reset): Oops, reset the position
pointer on a successful reset.
(stream_seek): Fixed.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | gmime-stream-file.c | 51 | ||||
-rw-r--r-- | gmime-stream-fs.c | 51 | ||||
-rw-r--r-- | gmime/gmime-stream-file.c | 51 | ||||
-rw-r--r-- | gmime/gmime-stream-fs.c | 51 |
5 files changed, 132 insertions, 80 deletions
@@ -1,5 +1,13 @@ 2001-09-19 Jeffrey Stedfast <fejj@ximian.com> + * gmime-stream-fs.c (stream_seek): Improve. + + * gmime-stream-file.c (stream_reset): Oops, reset the position + pointer on a successful reset. + (stream_seek): Fixed. + +2001-09-19 Jeffrey Stedfast <fejj@ximian.com> + * gmime-stream-fs.c (stream_reset): Reset the position offset. Doh! * gmime-stream.c (g_mime_stream_write_to_stream): Don't increment diff --git a/gmime-stream-file.c b/gmime-stream-file.c index aeed4afd..bb889a8f 100644 --- a/gmime-stream-file.c +++ b/gmime-stream-file.c @@ -134,46 +134,59 @@ static int stream_reset (GMimeStream *stream) { GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + int ret; g_return_val_if_fail (fstream->fp != NULL, -1); - return fseek (fstream->fp, stream->bound_start, SEEK_SET); + ret = fseek (fstream->fp, stream->bound_start, SEEK_SET); + if (ret != -1) + stream->position = stream->bound_start; + + return ret; } static off_t stream_seek (GMimeStream *stream, off_t offset, GMimeSeekWhence whence) { GMimeStreamFile *fstream = (GMimeStreamFile *) stream; - off_t ret; + off_t real = stream->position; + int ret; g_return_val_if_fail (fstream->fp != NULL, -1); switch (whence) { case GMIME_STREAM_SEEK_SET: - ret = fseek (fstream->fp, offset + stream->bound_start, SEEK_SET); + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; break; case GMIME_STREAM_SEEK_END: - if (offset < 0) { - offset += stream->bound_end; - ret = fseek (fstream->fp, offset, SEEK_SET); - } else { - ret = fseek (fstream->fp, stream->bound_end, SEEK_SET); + if (stream->bound_end == -1) { + fseek (fstream->fp, offset, SEEK_END); + real = ftell (fstream->fp); + if (real != -1) { + if (real < stream->bound_start) + real = stream->bound_start; + stream->position = real; + } + return real; } + real = stream->bound_end + offset; break; - case GMIME_STREAM_SEEK_CUR: - offset += stream->position; - if (offset < stream->bound_start) { - ret = fseek (fstream->fp, stream->bound_start, SEEK_SET); - } else if (offset > stream->bound_end) { - ret = fseek (fstream->fp, stream->bound_end, SEEK_SET); - } else { - ret = fseek (fstream->fp, offset, SEEK_CUR); - } } - stream->position = ftell (fstream->fp); + if (stream->bound_end != -1) + real = MIN (real, stream->bound_end); + real = MAX (real, stream->bound_start); - return ret; + ret = fseek (fstream->fp, real, SEEK_SET); + if (ret == -1) + return -1; + + stream->position = real; + + return real; } static off_t diff --git a/gmime-stream-fs.c b/gmime-stream-fs.c index ba3fd37e..2645e78e 100644 --- a/gmime-stream-fs.c +++ b/gmime-stream-fs.c @@ -155,10 +155,10 @@ stream_reset (GMimeStream *stream) g_return_val_if_fail (fstream->fd != -1, -1); ret = lseek (fstream->fd, stream->bound_start, SEEK_SET); - if (ret != -1) + if (ret != -1) { fstream->eos = FALSE; - - stream->position = stream->bound_start; + stream->position = stream->bound_start; + } return ret; } @@ -167,36 +167,45 @@ static off_t stream_seek (GMimeStream *stream, off_t offset, GMimeSeekWhence whence) { GMimeStreamFs *fstream = (GMimeStreamFs *) stream; - off_t ret; + off_t real = stream->position; g_return_val_if_fail (fstream->fd != -1, -1); switch (whence) { case GMIME_STREAM_SEEK_SET: - ret = lseek (fstream->fd, offset + stream->bound_start, SEEK_SET); + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; break; case GMIME_STREAM_SEEK_END: - if (offset < 0) { - offset += stream->bound_end; - ret = lseek (fstream->fd, offset, SEEK_SET); - } else { - ret = lseek (fstream->fd, stream->bound_end, SEEK_SET); + if (stream->bound_end == -1) { + real = lseek (fstream->fd, offset, SEEK_END); + if (real != -1) { + if (real < stream->bound_start) + real = stream->bound_start; + stream->position = real; + } + return real; } + real = stream->bound_end + offset; break; - case GMIME_STREAM_SEEK_CUR: - offset += stream->position; - if (offset < stream->bound_start) { - ret = lseek (fstream->fd, stream->bound_start, SEEK_SET); - } else if (offset > stream->bound_end) { - ret = lseek (fstream->fd, stream->bound_end, SEEK_SET); - } else { - ret = lseek (fstream->fd, offset, SEEK_CUR); - } } - stream->position = lseek (fstream->fd, 0, SEEK_CUR); + if (stream->bound_end != -1) + real = MIN (real, stream->bound_end); + real = MAX (real, stream->bound_start); - return ret; + real = lseek (fstream->fd, real, SEEK_SET); + if (real == -1) + return -1; + + if (real != stream->position && fstream->eos) + fstream->eos = FALSE; + + stream->position = real; + + return real; } static off_t diff --git a/gmime/gmime-stream-file.c b/gmime/gmime-stream-file.c index aeed4afd..bb889a8f 100644 --- a/gmime/gmime-stream-file.c +++ b/gmime/gmime-stream-file.c @@ -134,46 +134,59 @@ static int stream_reset (GMimeStream *stream) { GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + int ret; g_return_val_if_fail (fstream->fp != NULL, -1); - return fseek (fstream->fp, stream->bound_start, SEEK_SET); + ret = fseek (fstream->fp, stream->bound_start, SEEK_SET); + if (ret != -1) + stream->position = stream->bound_start; + + return ret; } static off_t stream_seek (GMimeStream *stream, off_t offset, GMimeSeekWhence whence) { GMimeStreamFile *fstream = (GMimeStreamFile *) stream; - off_t ret; + off_t real = stream->position; + int ret; g_return_val_if_fail (fstream->fp != NULL, -1); switch (whence) { case GMIME_STREAM_SEEK_SET: - ret = fseek (fstream->fp, offset + stream->bound_start, SEEK_SET); + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; break; case GMIME_STREAM_SEEK_END: - if (offset < 0) { - offset += stream->bound_end; - ret = fseek (fstream->fp, offset, SEEK_SET); - } else { - ret = fseek (fstream->fp, stream->bound_end, SEEK_SET); + if (stream->bound_end == -1) { + fseek (fstream->fp, offset, SEEK_END); + real = ftell (fstream->fp); + if (real != -1) { + if (real < stream->bound_start) + real = stream->bound_start; + stream->position = real; + } + return real; } + real = stream->bound_end + offset; break; - case GMIME_STREAM_SEEK_CUR: - offset += stream->position; - if (offset < stream->bound_start) { - ret = fseek (fstream->fp, stream->bound_start, SEEK_SET); - } else if (offset > stream->bound_end) { - ret = fseek (fstream->fp, stream->bound_end, SEEK_SET); - } else { - ret = fseek (fstream->fp, offset, SEEK_CUR); - } } - stream->position = ftell (fstream->fp); + if (stream->bound_end != -1) + real = MIN (real, stream->bound_end); + real = MAX (real, stream->bound_start); - return ret; + ret = fseek (fstream->fp, real, SEEK_SET); + if (ret == -1) + return -1; + + stream->position = real; + + return real; } static off_t diff --git a/gmime/gmime-stream-fs.c b/gmime/gmime-stream-fs.c index ba3fd37e..2645e78e 100644 --- a/gmime/gmime-stream-fs.c +++ b/gmime/gmime-stream-fs.c @@ -155,10 +155,10 @@ stream_reset (GMimeStream *stream) g_return_val_if_fail (fstream->fd != -1, -1); ret = lseek (fstream->fd, stream->bound_start, SEEK_SET); - if (ret != -1) + if (ret != -1) { fstream->eos = FALSE; - - stream->position = stream->bound_start; + stream->position = stream->bound_start; + } return ret; } @@ -167,36 +167,45 @@ static off_t stream_seek (GMimeStream *stream, off_t offset, GMimeSeekWhence whence) { GMimeStreamFs *fstream = (GMimeStreamFs *) stream; - off_t ret; + off_t real = stream->position; g_return_val_if_fail (fstream->fd != -1, -1); switch (whence) { case GMIME_STREAM_SEEK_SET: - ret = lseek (fstream->fd, offset + stream->bound_start, SEEK_SET); + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; break; case GMIME_STREAM_SEEK_END: - if (offset < 0) { - offset += stream->bound_end; - ret = lseek (fstream->fd, offset, SEEK_SET); - } else { - ret = lseek (fstream->fd, stream->bound_end, SEEK_SET); + if (stream->bound_end == -1) { + real = lseek (fstream->fd, offset, SEEK_END); + if (real != -1) { + if (real < stream->bound_start) + real = stream->bound_start; + stream->position = real; + } + return real; } + real = stream->bound_end + offset; break; - case GMIME_STREAM_SEEK_CUR: - offset += stream->position; - if (offset < stream->bound_start) { - ret = lseek (fstream->fd, stream->bound_start, SEEK_SET); - } else if (offset > stream->bound_end) { - ret = lseek (fstream->fd, stream->bound_end, SEEK_SET); - } else { - ret = lseek (fstream->fd, offset, SEEK_CUR); - } } - stream->position = lseek (fstream->fd, 0, SEEK_CUR); + if (stream->bound_end != -1) + real = MIN (real, stream->bound_end); + real = MAX (real, stream->bound_start); - return ret; + real = lseek (fstream->fd, real, SEEK_SET); + if (real == -1) + return -1; + + if (real != stream->position && fstream->eos) + fstream->eos = FALSE; + + stream->position = real; + + return real; } static off_t |