summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2001-09-20 01:53:49 +0000
committerJeffrey Stedfast <fejj@src.gnome.org>2001-09-20 01:53:49 +0000
commitf35147e30e33e6f57e55d7da2bd00d70ea045d42 (patch)
treeb4ab693e5b0b3c767e4a69990d56d18b835de0ef
parent1b3b8c410b2b630f5423f6cf9edb1e12cd8d4ead (diff)
downloadgmime-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--ChangeLog8
-rw-r--r--gmime-stream-file.c51
-rw-r--r--gmime-stream-fs.c51
-rw-r--r--gmime/gmime-stream-file.c51
-rw-r--r--gmime/gmime-stream-fs.c51
5 files changed, 132 insertions, 80 deletions
diff --git a/ChangeLog b/ChangeLog
index 3301113b..28c57c1b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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