X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/281d0fd48965b973ca69a432b2a9bf0152ae9023..21237d054e4b9d6091decded21898b22dfb4f92c:/lib/hreader.c diff --git a/lib/hreader.c b/lib/hreader.c index 9bcc808..177aa93 100644 --- a/lib/hreader.c +++ b/lib/hreader.c @@ -22,14 +22,21 @@ #include "mem.h" #include #include +#include +#include static int hreader_fill(struct hreader *h, off_t offset); -void hreader_init(const char *path, struct hreader *h) { +int hreader_init(const char *path, struct hreader *h) { + struct stat sb; + if(stat(path, &sb) < 0) + return -1; memset(h, 0, sizeof *h); h->path = xstrdup(path); + h->size = sb.st_size; h->bufsize = 65536; h->buffer = xmalloc_noptr(h->bufsize); + return 0; } int hreader_read(struct hreader *h, void *buffer, size_t n) { @@ -78,6 +85,18 @@ static int hreader_fill(struct hreader *h, off_t offset) { return n; } +off_t hreader_seek(struct hreader *h, off_t offset, int whence) { + switch(whence) { + case SEEK_SET: break; + case SEEK_CUR: offset += h->read_offset; break; + case SEEK_END: offset += h->size; break; + default: einval: errno = EINVAL; return -1; + } + if(offset < 0) goto einval; + h->read_offset = offset; + return offset; +} + /* Local Variables: c-basic-offset:2