optimize seek function for memory streams
authorRich Felker <dalias@aerifal.cx>
Sun, 4 Sep 2011 04:08:32 +0000 (00:08 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 4 Sep 2011 04:08:32 +0000 (00:08 -0400)
src/stdio/open_memstream.c
src/stdio/open_wmemstream.c

index 5773709..7fc1620 100644 (file)
@@ -13,21 +13,12 @@ static off_t ms_seek(FILE *f, off_t off, int whence)
 {
        ssize_t base;
        struct cookie *c = f->cookie;
-       switch (whence) {
-       case SEEK_SET:
-               base = 0;
-               break;
-       case SEEK_CUR:
-               base = c->pos;
-               break;
-       case SEEK_END:
-               base = c->len;
-               break;
-       default:
-       fail:
+       if (whence>2U) {
+fail:
                errno = EINVAL;
                return -1;
        }
+       base = (size_t [3]){0, c->pos, c->len}[whence];
        if (off < -base || off > SSIZE_MAX-base) goto fail;
        return c->pos = base+off;
 }
index 41b92d2..0db7741 100644 (file)
@@ -14,21 +14,12 @@ static off_t wms_seek(FILE *f, off_t off, int whence)
 {
        ssize_t base;
        struct cookie *c = f->cookie;
-       switch (whence) {
-       case SEEK_SET:
-               base = 0;
-               break;
-       case SEEK_CUR:
-               base = c->pos;
-               break;
-       case SEEK_END:
-               base = c->len;
-               break;
-       default:
-       fail:
+       if (whence>2U) {
+fail:
                errno = EINVAL;
                return -1;
        }
+       base = (size_t [3]){0, c->pos, c->len}[whence];
        if (off < -base || off > SSIZE_MAX/4-base) goto fail;
        memset(&c->mbs, 0, sizeof c->mbs);
        return c->pos = base+off;