X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/281d0fd48965b973ca69a432b2a9bf0152ae9023..92db088e5b292c1180a090ed369b9851e933e610:/lib/hreader.h diff --git a/lib/hreader.h b/lib/hreader.h index 8ef3a40..90431c1 100644 --- a/lib/hreader.h +++ b/lib/hreader.h @@ -28,7 +28,8 @@ * Allows files to be read without holding them open. */ struct hreader { - const char *path; /* file to read */ + char *path; /* file to read */ + off_t size; /* file size */ off_t read_offset; /* for next hreader_read() */ off_t buf_offset; /* offset of start of buffer */ char *buffer; /* input buffer */ @@ -39,8 +40,14 @@ struct hreader { /** @brief Initialize a hands-off reader * @param path File to read * @param h Reader to initialize + * @return 0 on success, -1 on error */ -void hreader_init(const char *path, struct hreader *h); +int hreader_init(const char *path, struct hreader *h); + +/** @brief Close a hands-off reader + * @param h Reader to close + */ +void hreader_close(struct hreader *h); /** @brief Read some bytes * @param h Reader to read from @@ -59,6 +66,34 @@ int hreader_read(struct hreader *h, void *buffer, size_t n); */ int hreader_pread(struct hreader *h, void *buffer, size_t n, off_t offset); +/** @brief Seek within a file + * @param h Reader to seek + * @param offset Offset + * @param whence SEEK_* + * @return Result offset + */ +off_t hreader_seek(struct hreader *h, off_t offset, int whence); + +/** @brief Return file size + * @param h Reader to find size of + * @return Size in bytes + */ +static inline off_t hreader_size(const struct hreader *h) { + return h->size; +} + +/** @brief Test for end of file + * @param h Reader to test + * @return 1 at eof, 0 otherwise + * + * This tells you whether the next read will return 0 bytes, rather than + * whether the last read reached end of file. So it is slightly different to + * feof(). + */ +static inline int hreader_eof(const struct hreader *h) { + return h->read_offset == h->size; +} + #endif /* HREADER_H */ /*