X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/281d0fd48965b973ca69a432b2a9bf0152ae9023..16b0fea8ae1a581d568dbee2efa2932aa4e6fcce:/lib/hreader.c diff --git a/lib/hreader.c b/lib/hreader.c index 9bcc808..bdf3c07 100644 --- a/lib/hreader.c +++ b/lib/hreader.c @@ -18,18 +18,32 @@ /** @file lib/hreader.c * @brief Hands-off reader - read files without keeping them open */ +#include #include "hreader.h" #include "mem.h" #include #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; +} + +void hreader_close(struct hreader *h) { + xfree(h->path); + xfree(h->buffer); } int hreader_read(struct hreader *h, void *buffer, size_t n) { @@ -78,6 +92,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