+ * A compressed resource in a WIM consists of a number of compressed chunks,
+ * each of which decompresses to a fixed chunk size (given in the WIM header;
+ * usually 32768) except possibly the last, which always decompresses to any
+ * remaining bytes. In addition, immediately before the chunks, a table (the
+ * "chunk table") provides the offset, in bytes relative to the end of the chunk
+ * table, of the start of each compressed chunk, except for the first chunk
+ * which is omitted as it always has an offset of 0. Therefore, a compressed
+ * resource with N chunks will have a chunk table with N - 1 entries.
+ *
+ * Additional information:
+ *
+ * - Entries in the chunk table are 4 bytes each, except if the uncompressed
+ * size of the resource is greater than 4 GiB, in which case the entries in
+ * the chunk table are 8 bytes each. In either case, the entries are unsigned
+ * little-endian integers.
+ *
+ * - The chunk table is included in the compressed size of the resource provided
+ * in the corresponding entry in the WIM's stream lookup table.
+ *
+ * - The compressed size of a chunk is never greater than the uncompressed size.
+ * From the compressor's point of view, chunks that would have compressed to a
+ * size greater than or equal to their original size are in fact stored
+ * uncompressed. From the decompresser's point of view, chunks with
+ * compressed size equal to their uncompressed size are in fact uncompressed.
+ *
+ * Furthermore, wimlib supports its own "pipable" WIM format, and for this the
+ * structure of compressed resources was modified to allow piped reading and
+ * writing. To make sequential writing possible, the chunk table is placed
+ * after the chunks rather than before the chunks, and to make sequential
+ * reading possible, each chunk is prefixed with a 4-byte header giving its
+ * compressed size as a 32-bit, unsigned, little-endian integer. Otherwise the
+ * details are the same.
+ */
+
+
+struct data_range {
+ u64 offset;
+ u64 size;
+};
+
+/*
+ * read_compressed_wim_resource() -
+ *
+ * Read data from a compressed WIM resource.
+ *
+ * @rspec
+ * Specification of the compressed WIM resource to read from.
+ * @ranges
+ * Nonoverlapping, nonempty ranges of the uncompressed resource data to
+ * read, sorted by increasing offset.
+ * @num_ranges
+ * Number of ranges in @ranges; must be at least 1.
+ * @cb
+ * Callback function to feed the data being read. Each call provides the
+ * next chunk of the requested data, uncompressed. Each chunk will be of
+ * nonzero size and will not cross range boundaries, but otherwise will be
+ * of unspecified size.
+ * @cb_ctx
+ * Parameter to pass to @cb_ctx.
+ *
+ * Possible return values:
+ *
+ * WIMLIB_ERR_SUCCESS (0)
+ * WIMLIB_ERR_READ (errno set)
+ * WIMLIB_ERR_UNEXPECTED_END_OF_FILE (errno set to 0)
+ * WIMLIB_ERR_NOMEM (errno set to ENOMEM)
+ * WIMLIB_ERR_DECOMPRESSION (errno set to EINVAL)
+ *
+ * or other error code returned by the @cb function.