diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-12-04 14:10:21 -0800 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-12-04 14:10:21 -0800 |
commit | 12e09f9f85ac48ff891adf92f3b2c9a5fea27273 (patch) | |
tree | 60051793885e9978dadf6672ef85cdda216676a2 /src/base/io/seek.c | |
parent | b80a3d28ce42be4fdec451f74620b10ee75219dc (diff) |
Chore(REMOVE): finished deprecation of old io functions.
The old methods were simple wrappers of C standard library functions.
We've moved (painfully) over to a new interface that allows for files to
live on the stack. All users of the functionality are ported over.
Diffstat (limited to 'src/base/io/seek.c')
-rw-r--r-- | src/base/io/seek.c | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/src/base/io/seek.c b/src/base/io/seek.c index 1be4ee7..4fa1aff 100644 --- a/src/base/io/seek.c +++ b/src/base/io/seek.c @@ -1,7 +1,57 @@ #include "internal.h" int -io·seek(io·Stream *s, long off, int whence) +io·seek(io·Header *io, intptr offset, int whence, intptr *pos) { - return fseek(s, off, whence); + intptr n,d,cap; + + switch(io->state){ + default: + fmt·fprint(2, "seek: unknown state %d\n", io->state); + return io·BufEof; + case io·BufEnd: + io->state = io·BufRdr; + io->ilen = 0; + io->g = io->e; + /* fallthrough */ + case io·BufRdr: + n = offset; + if(whence == sys·SeekCur){ + n += io·offset(io); + whence = sys·SeekSet; + } + + /* can we seek inside our buffer */ + if(whence == sys·SeekSet){ + d = n - io·offset(io); + cap = io->e - io->g; + if(-cap <= d && d <= cap){ + io->ilen += d; + if(d >= 0){ + if(io->ilen <= 0){ + *pos = n; + return 0; + } + }else{ + if(io->e - io->g >= -io->ilen){ + *pos = n; + return 0; + } + } + } + } + + /* nope, call the kernel to do it for us */ + sys·seek(io->fd, offset, whence, &n); + io->ilen = 0; + io->g = io->e; + break; + + case io·BufWtr: + io·flush(io); + sys·seek(io->fd, offset, whence, &n); + break; + } + io->pos = *pos = n; + return 0; } |