mirror of
https://git.musl-libc.org/git/musl
synced 2025-02-03 20:05:37 +03:00
optimize seek function for memory streams
This commit is contained in:
parent
32d67e938e
commit
c88f36f556
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user