chiark / gitweb /
Hands-off reading for OGGs.
[disorder] / lib / hreader.h
index 1eadc5574b5610d699d683dce851d9b62baabcce..46f8bd918b9e9ba9e17d1e821af8ed2c7509762a 100644 (file)
  */
 struct hreader {
   const char *path;            /* file to read */
-  off_t offset;                        /* how far we've read so far */
+  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 */
   size_t bufsize;              /* buffer size */
   size_t bytes;                        /* size of last read */
-  size_t consumed;             /* bytes consumed by caller from last read */
 };
 
 /** @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 Read some bytes
  * @param h Reader to read from
@@ -50,20 +52,22 @@ void hreader_init(const char *path, struct hreader *h);
  */
 int hreader_read(struct hreader *h, void *buffer, size_t n);
 
-/** @brief Read more bytes
- * @param h Reader to update
- * @return Bytes available to read
- *
- * If not all bytes were consumed so far then just returns the number
- * of bytes left to consume.
+/** @brief Read some bytes at a given offset
+ * @param h Reader to read from
+ * @param offset Offset to read at
+ * @param buffer Where to store bytes
+ * @param n Maximum bytes to read
+ * @return Bytes read, or 0 at EOF, or -1 on error
  */
-int hreader_fill(struct hreader *h);
+int hreader_pread(struct hreader *h, void *buffer, size_t n, off_t offset);
 
-/** @brief Consume some bytes
- * @param h Reader to update
- * @param n Bytes to consume
+/** @brief Seek within a file
+ * @param h Reader to seek
+ * @param offset Offset
+ * @param whence SEEK_*
+ * @return Result offset
  */
-void hreader_consume(struct hreader *h, size_t n);
+off_t hreader_seek(struct hreader *h, off_t offset, int whence);
 
 #endif /* HREADER_H */